Tomcat提供了 两种配置数据源的方式,这两种方式所配置的数据源访问范围不同:一种数据源可以让所有的Web运用都访问,被称为全局数据源;另一种只能在单个Web运用中访问,被称为局部数据源。
不管配置那种数据源,都需要提供特定的数据库JDBC驱动。本书以MySQL为例来配置数据源,所以读者必须将MySQL的JDBC驱动程序复制到Tomcat的lib路径下
局部数据源无需修改系统的配置文件,之需要修改用户自己的Web部署文件,不会造成系统的混乱,而且数据源被封装在一个Web运用之内,防止被其他的Web运用访问,提供了更好的封装性。
局部数据源只与特定的Web运用相关,因此在该Web运用对应的部署文件中配置。例如,为上篇的Web运用增加局部数据源,修改Tomcat下 conf /Catalina/localhost 的webDemo.xml 文件即可。为 Context元素增加一个Resource子元素;增加局部数据源的 webDemo.xml文件内容如下:
1 <?xml version='1.0' encoding='utf-8'?> 2 <Context docBase="D:/webapps/webDemo" path="/webDemo" privileged="true" reloadable="true"> 3 <!-- maxActive: Maximum number of database connections in pool. Make sure you 4 configure your mysqld max_connections large enough to handle 5 all of your db connections. Set to -1 for no limit. 6 --> 7 8 <!-- maxIdle: Maximum number of idle database connections to retain in pool. 9 Set to -1 for no limit. See also the DBCP documentation on this 10 and the minEvictableIdleTimeMillis configuration parameter. 11 --> 12 13 <!-- maxWait: Maximum time to wait for a database connection to become available 14 in ms, in this example 10 seconds. An Exception is thrown if 15 this timeout is exceeded. Set to -1 to wait indefinitely. 16 --> 17 18 <!-- username and password: MySQL username and password for database connections --> 19 20 <!-- driverClassName: Class name for the old mm.mysql JDBC driver is 21 org.gjt.mm.mysql.Driver - we recommend using Connector/J though. 22 Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver. 23 --> 24 25 <!-- url: The JDBC connection url for connecting to your MySQL database. 26 --> 27 28 <Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource" 29 maxActive="100" maxIdle="30" maxWait="10000" 30 username="root" password="" driverClassName="com.mysql.jdbc.Driver" 31 url="jdbc:mysql://localhost:3306/javatest"/> 32 </Context>
上面的Resource 元素为该Web运用配置了一个局部数据源,该元素的个属性指定了数据源的各种配置信息。
其实DBCP 运用到了 JNDI 技术 Java Naming Directory Interface 即 Java命名和目录接口,听起来非常专业 其实很简单:就是为某个Java对象起一个名字。我们知道 我们通常获得一个对象 是通过 new 创建,而通过JNDI 这种技术 我们 只需要通过 对象的别名即可访问,其实就是Java的一种对象访问技术,我们可以这样理解 我们通过 网址访问 某个页面,你可以把对象类比为 一个页面 ,而它的 别名 就是 网址。通过这种 服务端/客户端 的方式 我们可以在任何地方 访问这个对象,只要有这个对象提供了JNDI服务。
再次启动Tomcat 该web运用即可通过该JNDI 名字来访问该数据源。下面是测试访问数据源的 代码清单:
SQL代码:
1 create database javatest; 2 use javatest; 3 create table testdata ( 4 id int not null auto_increment primary key, 5 foo varchar(25), 6 bar int); 7 insert into testdata values(null, 'hello', 12345);
web.xml 文件
1 <web-app xmlns="http://java.sun.com/xml/ns/j2ee" 2 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 3 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee 4 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd" 5 version="2.4"> 6 <description>MySQL Test App</description> 7 <resource-ref> 8 <description>DB Connection</description> 9 <res-ref-name>jdbc/TestDB</res-ref-name> 10 <res-type>javax.sql.DataSource</res-type> 11 <res-auth>Container</res-auth> 12 </resource-ref> 13 </web-app>
test.jsp页面
1 <%@page import="java.sql.ResultSet"%> 2 <%@page import="java.sql.Statement"%> 3 <%@page import="java.sql.Connection"%> 4 <%@page import="javax.sql.DataSource"%> 5 <%@page import="javax.naming.InitialContext"%> 6 <%@page import="javax.naming.Context"%> 7 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 8 9 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 10 <html> 11 <head> 12 <title>test</title> 13 14 <meta http-equiv="pragma" content="no-cache"> 15 <meta http-equiv="cache-control" content="no-cache"> 16 <meta http-equiv="expires" content="0"> 17 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 18 <meta http-equiv="description" content="This is my page"> 19 20 </head> 21 22 <body> 23 <% 24 //初始化 Context ,使用 InitialContext初始化Context 25 Context ctx = new InitialContext(); 26 //通过JNDI查找数据源,该JNDI 为 java:comp/env/jdbc/TestDB 分成两个部分 27 //java:comp:/env 是Tomcat固定的,Tomcat提供的JNDI绑定都必须加该前缀 28 //jdbc/TestDB 是定义数据源时的数据源名 29 DataSource ds = (DataSource) ctx 30 .lookup("java:comp/env/jdbc/TestDB"); 31 Connection conn = ds.getConnection(); 32 Statement stmt = conn.createStatement(); 33 ResultSet rs = stmt.executeQuery("select * from testdata"); 34 while (rs.next()) { 35 out.println(rs.getString(2)); 36 } 37 %> 38 </body> 39 </html>
上面的29行代码实现了 JNDI查找数据源对象,一旦获取了该数据源对象,程序就可以通过该数据源取得数据库连接,从而访问数据库。
上面的方式 是 访问局部数据源,如果需要配置全局数据源,则应通过修改 server.xml 文件来实现。全局数据源的配置与局部数据源的配置基本类似,只是修改的文件不同。局部数据源只需要修改Web运用的配置文件,而全局数据源需修改Tomcat的 server.xml 文件:(使用全局数据源需要修改Tomcat原有的server.xml,所以可能导致破话Tomcat系统,因而尽量避免使用全局数据源)