配置Tomcat数据源

         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系统,因而尽量避免使用全局数据源)

原文地址:https://www.cnblogs.com/ArtsCrafts/p/Tomcat_DBCP.html