JNDI学习总结()

http://blog.csdn.net/samjustin1/article/details/52265796

一、数据源的由来

  在Java开发中,使用JDBC操作数据库的四个步骤如下:

      ①加载数据库驱动程序(Class.forName("数据库驱动类");)
      ②连接数据库(Connection con  = DriverManager.getConnection();)
      ③操作数据库(PreparedStatement stat = con.prepareStatement(sql);stat.executeQuery();)
      ④关闭数据库,释放连接(con.close();)
  也就是说,所有的用户都需要经过此四步进行操作,但是这四步之中有三步(①加载数据库驱动程序、②连接数据库、④关闭数据库,释放连接)对所有人都是一样的,而所有人只有在操作数据库上是不一样,那么这就造成了性能的损耗。
  那么最好的做法是,准备出一个空间,此空间里专门保存着全部的数据库连接,以后用户用数据库操作的时候不用再重新加载驱动、连接数据库之类的,而直接从此空间中取走连接,关闭的时候直接把连接放回到此空间之中。
  那么此空间就可以称为连接池(保存所有的数据库连接),但是如果要想实现此空间的话,则必须有一个问题要考虑?
      1、 如果没有任何一个用户使用连接,那么那么应该维持一定数量的连接,等待用户使用。
      2、 如果连接已经满了,则必须打开新的连接,供更多用户使用。
      3、 如果一个服务器就只能有100个连接,那么如果有第101个人过来呢?应该等待其他用户释放连接
      4、 如果一个用户等待时间太长了,则应该告诉用户,操作是失败的。
   如果直接用程序实现以上功能,则会比较麻烦,所以在Tomcat 4.1.27之后,在服务器上就直接增加了数据源的配置选项,直接在服务器上配置好数据源连接池即可。在J2EE服务器上保存着一个数据库的多个连接。每一个连接通过DataSource可以找到。DataSource被绑定在了JNDI树上(为每一个DataSource提供一个名字)客户端通过名称找到在JNDI树上绑定的DataSource,再由DataSource找到一个连接。如下图所示:
  
  那么在以后的操作中,除了数据库的连接方式不一样之外,其他的所有操作都一样,只是关闭的时候不是彻底地关闭数据库,而是把数据库的连接放回到连接池中去。
  如果要想使用数据源的配置,则必须配置虚拟目录,因为此配置是在虚拟目录之上起作用的。需要注意的是,如果要想完成以上的功能,在Tomcat服务器上一定要有各个数据库的驱动程序。

二、JNDI+Tomcat配置数据源的两种方式

2.1、全局jndi配置

  此种配置需要在server.xml中配置数据源,具体的配置步骤如下:

  1、在tomcat服务器的lib目录下加入数据库连接的驱动jar包

  

  2、修改tomcat服务器的conf目录下server.xml配置文件

  

  打开server.xml配置文件,可以看到里面自带的一个全局JNDI配置,如下图所示:

  

  编辑server.xml文件,添加全局JNDI数据源配置,配置如下:

复制代码
 1 <!-- Global JNDI resources
 2        Documentation at /docs/jndi-resources-howto.html
 3   -->
 4   <GlobalNamingResources>
 5     <!-- Editable user database that can also be used by
 6          UserDatabaseRealm to authenticate users
 7     -->
 8     <Resource name="UserDatabase" auth="Container"
 9               type="org.apache.catalina.UserDatabase"
10               description="User database that can be updated and saved"
11               factory="org.apache.catalina.users.MemoryUserDatabaseFactory"
12               pathname="conf/tomcat-users.xml" />
13 <!--
14   |- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称,
15            为了不与其他的名称混淆,所以使用jdbc/oracle,现在配置的是一个jdbc的关于oracle的命名服务。
16   |- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
17   |- type:此名称所代表的类型,现在为javax.sql.DataSource
18   |- maxActive:表示一个数据库在此服务器上所能打开的最大连接数
19   |- maxIdle:表示一个数据库在此服务器上维持的最小连接数
20   |- maxWait:最大等待时间。10000毫秒
21   |- username:数据库连接的用户名
22   |- password:数据库连接的密码
23   |- driverClassName:数据库连接的驱动程序
24   |- url:数据库连接的地址
25 -->
26 <!--配置Oracle数据库的JNDI数据源-->
27 <Resource 
28         name="jdbc/oracle"
29         auth="Container" 
30         type="javax.sql.DataSource"
31         maxActive="100" 
32         maxIdle="30" 
33         maxWait="10000"
34         username="lead_oams" 
35         password="p"
36         driverClassName="oracle.jdbc.driver.OracleDriver"
37         url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/>
38 
39 <!--配置MySQL数据库的JNDI数据源-->
40 <Resource 
41         name="jdbc/mysql"
42         auth="Container" 
43         type="javax.sql.DataSource"
44         maxActive="100" 
45         maxIdle="30" 
46         maxWait="10000"
47         username="root" 
48         password="root"
49         driverClassName="com.mysql.jdbc.Driver"
50         url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&amp;characterEncoding=utf-8"/>
51 
52 <!--配置SQLServer数据库的JNDI数据源-->
53 <Resource 
54         name="jdbc/sqlserver"
55         auth="Container" 
56         type="javax.sql.DataSource"
57         maxActive="100" 
58         maxIdle="30" 
59         maxWait="10000"
60         username="sa" 
61         password="p@ssw0rd"
62         driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
63         url="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"/>
64 
65   </GlobalNamingResources>
复制代码

  经过以上的两个步骤,全局JNDI数据源就配置好了,在上述的server.xml文件中,分别配置了Oracle、MySQL、SQLServer这三种数据库的全局JNDI数据源

2.2、全局jndi数据源测试

  1、创建一个JNDI测试项目JNDITest,在web.xml中添加JNDI配置的资源引用

  

  web.xml的配置如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <welcome-file-list>
 8     <welcome-file>index.jsp</welcome-file>
 9   </welcome-file-list>
10   
11   <!-- 
12   JNDI配置的资源引用:
13   �6�1 res-ref-name:表示引用资源的名称
14   �6�1 res-type:此资源对应的类型为javax.sql.DataSource
15   �6�1 res-auth:容器授权管理
16    -->
17    <!--Oracle数据库JNDI数据源引用 -->
18   <resource-ref>
19       <description>Oracle DB Connection</description>
20       <res-ref-name>oracleDataSource</res-ref-name>
21       <res-type>javax.sql.DataSource</res-type>
22       <res-auth>Container</res-auth>
23  </resource-ref>
24   
25   <!--MySQL数据库JNDI数据源引用 -->
26   <resource-ref>
27       <description>MySQL DB Connection</description>
28       <res-ref-name>mysqlDataSource</res-ref-name>
29       <res-type>javax.sql.DataSource</res-type>
30       <res-auth>Container</res-auth>
31   </resource-ref>
32   
33   <!--SQLServer数据库JNDI数据源引用 -->
34   <resource-ref>
35       <description>SQLServer DB Connection</description>
36       <res-ref-name>sqlserverDataSource</res-ref-name>
37       <res-type>javax.sql.DataSource</res-type>
38       <res-auth>Container</res-auth>
39   </resource-ref>
40   
41 </web-app>
复制代码

  2、映射JNDITest项目的虚拟目录

  在tomcat的\conf\Catalina\localhost下(没有目录就新建)创建一个xml文件,文件名必须和项目名相同,测试JNDI数据源的web项目的项目名称是:JNDITest,所以xml文件的命名就叫JNDITest.xml,如下图所示:

  

  编辑JNDITest.xml,配置如下:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!--
 3     jndi配置方法(tomcat):
 4     将此文件放置在tomcat\conf\Catalina\localhost下(没有目录就新建)
 5  -->
 6 <!--映射JNDITest项目的虚拟目录-->
 7 <Context docBase="D:/MyEclipse8.5/workspace/JNDITest/WebRoot" debug="0" reloadable="false">
 8     <!--引用Oracle数据库的JNDI数据源-->
 9     <ResourceLink name="oracleDataSource" global="jdbc/oracle" type="javax.sql.DataSource"/>
10     <!--引用mysql数据库的JNDI数据源-->
11     <ResourceLink name="mysqlDataSource" global="jdbc/mysql" type="javax.sql.DataSource"/>
12     <!--引用sqlserver数据库的JNDI数据源-->
13     <ResourceLink name="sqlserverDataSource" global="jdbc/sqlserver" type="javax.sql.DataSource"/>
14 </Context>
复制代码

  3、测试从JNDI数据源获取数据库连接

  配置完数据源连接池之后,就可以按照以下的步骤进行访问:

    �6�1 初始化名称查找上下文
    �6�1 通过JNDI名称找到DataSource
    �6�1 通过DataSource取得一个连接
    �6�1 操作数据库
    �6�1 关闭数据库,关闭的时候是将连接放回到连接池之中

  jsp测试页面代码如下:

复制代码
  1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2 <%@ page import="java.sql.*,javax.sql.*,javax.naming.*" %>
  3 
  4 <!DOCTYPE HTML>
  5 <html>
  6   <head>
  7     <title>JNDI数据源测试</title>
  8   </head>
  9   
 10   <body>
 11         <%
 12             Connection connOracle = null;
 13             try {
 14                 //1、初始化名称查找上下文
 15                 Context ctx = new InitialContext();
 16                 //InitialContext ctx = new InitialContext();亦可 
 17                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名
 18                 /*
 19                 DataSource名在web.xml文件中的<res-ref-name>oracleDataSource</res-ref-name>进行了配置
 20                  <!--Oracle数据库JNDI数据源引用 -->
 21                  <resource-ref>
 22                       <description>Oracle DB Connection</description>
 23                       <res-ref-name>oracleDataSource</res-ref-name>
 24                       <res-type>javax.sql.DataSource</res-type>
 25                       <res-auth>Container</res-auth>
 26                  </resource-ref>
 27                 */
 28                 DataSource ds = (DataSource)ctx.lookup("java:comp/env/oracleDataSource");
 29                 //3、通过DataSource取得一个连接
 30                 connOracle = ds.getConnection();
 31                 out.println("Oracle Connection pool connected !!");
 32                 //4、操作数据库
 33             } catch (NamingException e) {
 34                 System.out.println(e.getMessage());
 35             } catch (SQLException e) {
 36                 e.printStackTrace();
 37             } finally {
 38                 //5、关闭数据库,关闭的时候是将连接放回到连接池之中
 39                 connOracle.close();
 40             }
 41         %>
 42         <hr/>
 43         <%
 44             Connection connMySQL = null;
 45             try {
 46                 //1、初始化名称查找上下文
 47                 Context ctx = new InitialContext();
 48                 //InitialContext ctx = new InitialContext();亦可 
 49                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面跟的是DataSource名
 50                 /*
 51                 DataSource名在web.xml文件中的<res-ref-name>mysqlDataSource</res-ref-name>进行了配置
 52                   <!--MySQL数据库JNDI数据源引用 -->
 53                   <resource-ref>
 54                       <description>MySQL DB Connection</description>
 55                       <res-ref-name>mysqlDataSource</res-ref-name>
 56                       <res-type>javax.sql.DataSource</res-type>
 57                       <res-auth>Container</res-auth>
 58                   </resource-ref>
 59                 */
 60                 DataSource ds = (DataSource)ctx.lookup("java:comp/env/mysqlDataSource");
 61                 //3、通过DataSource取得一个连接
 62                 connMySQL = ds.getConnection();
 63                 out.println("MySQL Connection pool connected !!");
 64                 //4、操作数据库
 65             } catch (NamingException e) {
 66                 System.out.println(e.getMessage());
 67             } catch (SQLException e) {
 68                 e.printStackTrace();
 69             } finally {
 70                 //5、关闭数据库,关闭的时候是将连接放回到连接池之中
 71                 connMySQL.close();
 72             }
 73         %>
 74         <hr/>
 75         <%
 76             Connection connSQLServer = null;
 77             try {
 78                 //1、初始化名称查找上下文
 79                 Context ctx = new InitialContext();
 80                 //InitialContext ctx = new InitialContext();亦可 
 81                 //2、通过JNDI名称找到DataSource,对名称进行定位java:comp/env是必须加的,后面的是DataSource名
 82                 /*
 83                 DataSource名在web.xml文件中的<res-ref-name>sqlserverDataSource</res-ref-name>进行了配置
 84                 <!--SQLServer数据库JNDI数据源引用 -->
 85                   <resource-ref>
 86                       <description>SQLServer DB Connection</description>
 87                       <res-ref-name>sqlserverDataSource</res-ref-name>
 88                       <res-type>javax.sql.DataSource</res-type>
 89                       <res-auth>Container</res-auth>
 90                   </resource-ref>
 91                 */
 92                 DataSource ds = (DataSource)ctx.lookup("java:comp/env/sqlserverDataSource");
 93                 //3、通过DataSource取得一个连接
 94                 connSQLServer = ds.getConnection();
 95                 out.println("SQLServer Connection pool connected !!");
 96                 //4、操作数据库
 97             } catch (NamingException e) {
 98                 System.out.println(e.getMessage());
 99             } catch (SQLException e) {
100                 e.printStackTrace();
101             } finally {
102                 //5、关闭数据库,关闭的时候是将连接放回到连接池之中
103                 connSQLServer.close();
104             }
105         %>
106     </body>
107 </html>
复制代码

  运行结果如下:

  

  除了可以在Jsp页面中编写java代码测试JNDI数据源连接之外,还有一种比较简单的方式就是使用JSTL标签库提供的sql标签进行测试,测试代码如下:

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入JSTL标签库 --%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
 5 <!DOCTYPE HTML>
 6 <html>
 7   <head>
 8     <title>JNDI数据源连接测试</title>
 9   </head>
10   
11   <body>
12           <h3>Oracle JNDI数据源测试</h3>
13           <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
14         <sql:query var="rs" dataSource="oracleDataSource">
15             <%--Oracle JNDI数据源测试 SQL--%>
16             SELECT * FROM LEAD_OAMS_DBSOURCES
17         </sql:query>
18         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
19         <c:forEach var="row" items="${rs.rows}">
20             <%--${row.字段名}获取字段的值--%>
21             ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}<br/>
22         </c:forEach>
23         <hr/>
24         <h3>MySQL JNDI数据源测试</h3>
25         <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
26         <sql:query var="rs" dataSource="mysqlDataSource">
27             <%--MySQL JNDI数据源测试 SQL--%>
28              select * from ld_user
29         </sql:query>
30         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
31         <c:forEach var="row" items="${rs.rows}">
32             <%--${row.字段名}获取字段的值--%>
33             ${row.id}---${row.username}---${row.password}<br/>
34         </c:forEach>
35         <hr/>
36         <h3>SQLServer JNDI数据源测试</h3>
37         <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
38         <sql:query var="rs" dataSource="sqlserverDataSource">
39             <%--SQLServer JNDI数据源测试 SQL--%>
40             select * from t_demo
41         </sql:query>
42         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
43         <c:forEach var="row" items="${rs.rows}">
44             <%--${row.字段名}获取字段的值--%>
45             ${row.id}---${row.time}<br/>
46         </c:forEach>
47   </body>
48 </html>
复制代码

  运行结果如下:

  

2.3、非全局jndi配置

  非全局JNDI数据源是针对某一个Web项目配置的数据源,具体的配置步骤如下:

   1、在tomcat服务器的lib目录下加入数据库连接的驱动jar包

   2、针对具体的web项目映射虚拟目录,然后在虚拟目录映射的配置文件中配置JNDI数据源

  还是以上面的JNDITest项目为例子进行说明

  在tomcat目录下的\conf\Catalina\localhost目录下创建一个JNDITest.xml文件,如下图所示:

  

  编辑JNDITest.xml文件,添加对JNDITest项目的虚拟目录的映射和JNDI数据源的配置

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <!--
 3     jndi配置方法(tomcat):
 4     将此文件放置在tomcat\conf\Catalina\localhost下(没有目录就新建)
 5  -->
 6 
 7 <Context docBase="D:/MyEclipse8.5/workspace/JNDITest/WebRoot" debug="0" reloadable="false">
 8 <!--
 9   |- name:表示以后要查找的名称。通过此名称可以找到DataSource,此名称任意更换,但是程序中最终要查找的就是此名称,
10            为了不与其他的名称混淆,所以使用jdbc/oracle,现在配置的是一个jdbc的关于oracle的命名服务。
11   |- auth:由容器进行授权及管理,指的用户名和密码是否可以在容器上生效
12   |- type:此名称所代表的类型,现在为javax.sql.DataSource
13   |- maxActive:表示一个数据库在此服务器上所能打开的最大连接数
14   |- maxIdle:表示一个数据库在此服务器上维持的最小连接数
15   |- maxWait:最大等待时间。10000毫秒
16   |- username:数据库连接的用户名
17   |- password:数据库连接的密码
18   |- driverClassName:数据库连接的驱动程序
19   |- url:数据库连接的地址
20 -->
21 <!--配置Oracle数据库的JNDI数据源-->
22 <Resource 
23         name="oracleDataSource"
24         auth="Container" 
25         type="javax.sql.DataSource"
26         maxActive="100" 
27         maxIdle="30" 
28         maxWait="10000"
29         username="lead_oams" 
30         password="p"
31         driverClassName="oracle.jdbc.driver.OracleDriver"
32         url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/>
33 
34 <!--配置MySQL数据库的JNDI数据源-->
35 <Resource 
36         name="mysqlDataSource"
37         auth="Container" 
38         type="javax.sql.DataSource"
39         maxActive="100" 
40         maxIdle="30" 
41         maxWait="10000"
42         username="root" 
43         password="root"
44         driverClassName="com.mysql.jdbc.Driver"
45         url="jdbc:mysql://192.168.1.144:3306/leadtest?useUnicode=true&amp;characterEncoding=utf-8"/>
46 
47 <!--配置SQLServer数据库的JNDI数据源-->
48 <Resource 
49         name="sqlserverDataSource"
50         auth="Container" 
51         type="javax.sql.DataSource"
52         maxActive="100" 
53         maxIdle="30" 
54         maxWait="10000"
55         username="sa" 
56         password="p@ssw0rd"
57         driverClassName="com.microsoft.sqlserver.jdbc.SQLServerDriver"
58         url="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"/>
59 </Context>
复制代码

   3、在web项目的web.xml文件中引用配置好的JNDI数据源

复制代码
 1  <!-- 
 2   JNDI配置的资源引用:
 3   �6�1 res-ref-name:表示引用资源的名称
 4   �6�1 res-type:此资源对应的类型为javax.sql.DataSource
 5   �6�1 res-auth:容器授权管理
 6    -->
 7    <!--Oracle数据库JNDI数据源引用 -->
 8   <resource-ref>
 9       <description>Oracle DB Connection</description>
10       <res-ref-name>oracleDataSource</res-ref-name>
11       <res-type>javax.sql.DataSource</res-type>
12       <res-auth>Container</res-auth>
13  </resource-ref>
14   
15   <!--MySQL数据库JNDI数据源引用 -->
16   <resource-ref>
17       <description>MySQL DB Connection</description>
18       <res-ref-name>mysqlDataSource</res-ref-name>
19       <res-type>javax.sql.DataSource</res-type>
20       <res-auth>Container</res-auth>
21   </resource-ref>
22   
23   <!--SQLServer数据库JNDI数据源引用 -->
24   <resource-ref>
25       <description>SQLServer DB Connection</description>
26       <res-ref-name>sqlserverDataSource</res-ref-name>
27       <res-type>javax.sql.DataSource</res-type>
28       <res-auth>Container</res-auth>
29   </resource-ref>
复制代码

  经过以上3个步骤,针对具体web项目配置的JNDI数据源就算是配置好了。具体的测试和上述测试全局JNDI数据源的方式是一样的!

 

Tomcat下使用C3P0配置JNDI数据源

一、C3P0下载

  C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  

  下载完成之后得到一个压缩包。

二、使用C3P0配置JNDI数据源

  Tomcat6.x中配置JNDI数据源时默认使用的是Tomcat6.x自带的DBCP连接池,Tomcat6.x使用DBCP连接池配置JNDI数据源如下:

复制代码
 1 <Resource 
 2     name="oracleDataSource" 
 3     auth="Container" 
 4     type="javax.sql.DataSource" 
 5     maxActive="50" 
 6     maxIdle="10" 
 7     maxWait="10000" 
 8     username="lead_oams" 
 9     password="p" 
10     driverClassName="oracle.jdbc.OracleDriver" 
11     url="jdbc:oracle:thin:@192.168.1.229:1521:lead"/>
复制代码

  如果想让Tomcat6.x使用C3P0连接池配置JNDI数据源,在配置时,以下配置项需要修改

  1、 type和factory的值发生变化

  2、username=>user

  3、url=>jdbcUrl

  4、driverClassName=>driverClass

  创建一个Web测试项目C3P0_JNDI_Config,解压压缩包,找到c3p0-0.9.5-pre9\lib目录下的相关Jar包如下图所示:

  

  将C3P0的相关Jar包添加到项目中,在项目的META-INF目录下创建一个context.xml文件,目录结构如下图所示:

  

  在tomcat服务器的lib目录下添加Oracle、MySQL、SQLServer三种数据库的驱动jar包,如下图所示:

  

  1、在context.xml文件中加入如下配置信息

复制代码
 1 <Context>
 2     <!-- 使用C3P0配置针对MySQL数据库的JNDI数据源 -->
 3     <Resource 
 4         name="jdbc/MysqlDataSource" 
 5         auth="Container"
 6         factory="org.apache.naming.factory.BeanFactory" 
 7         type="com.mchange.v2.c3p0.ComboPooledDataSource"
 8         driverClass="com.mysql.jdbc.Driver"
 9         idleConnectionTestPeriod="60"
10         maxPoolSize="50" 
11         minPoolSize="2"
12         acquireIncrement="2" 
13         user="root" 
14         password="root"
15         jdbcUrl="jdbc:mysql://192.168.1.144:3306/leadtest"/>
16         
17     <!-- 使用C3P0配置针对Oracle数据库的JNDI数据源 -->
18     <Resource 
19         name="jdbc/OracleDataSource" 
20         auth="Container"
21         factory="org.apache.naming.factory.BeanFactory" 
22         type="com.mchange.v2.c3p0.ComboPooledDataSource"
23         driverClass="oracle.jdbc.OracleDriver"
24         idleConnectionTestPeriod="60"
25         maxPoolSize="50" 
26         minPoolSize="2"
27         acquireIncrement="2" 
28         jdbcUrl="jdbc:oracle:thin:@192.168.1.229:1521:lead"
29         user="lead_oams"
30         password="p"/>
31         
32         
33     <!--使用C3P0配置针对SQLServer数据库的JNDI数据源-->
34     <Resource 
35         name="jdbc/SqlServerDataSource"
36         auth="Container"
37         factory="org.apache.naming.factory.BeanFactory" 
38         type="com.mchange.v2.c3p0.ComboPooledDataSource"
39         driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
40         idleConnectionTestPeriod="60"
41         maxPoolSize="50" 
42         minPoolSize="2"
43         acquireIncrement="2" 
44         jdbcUrl="jdbc:sqlserver://192.168.1.51:1433;DatabaseName=demo"
45         user="sa" 
46         password="p@ssw0rd"/>
47 </Context>
复制代码

  2.在web.xml引用JDNI数据源:

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <welcome-file-list>
 8     <welcome-file>index.jsp</welcome-file>
 9   </welcome-file-list>
10   
11   <!-- 
12       JNDI配置的资源引用:
13   • res-ref-name:表示引用资源的名称
14   • res-type:此资源对应的类型为javax.sql.DataSource
15   • res-auth:容器授权管理
16    -->
17    <!--Oracle数据库JNDI数据源引用 -->
18   <resource-ref>
19       <description>Oracle DB Connection</description>
20       <res-ref-name>jdbc/OracleDataSource</res-ref-name>
21       <res-type>javax.sql.DataSource</res-type>
22       <res-auth>Container</res-auth>
23  </resource-ref>
24   
25   <!--MySQL数据库JNDI数据 -->
26   <resource-ref>
27       <description>MySQL DB Connection</description>
28       <res-ref-name>jdbc/MysqlDataSource</res-ref-name>
29       <res-type>javax.sql.DataSource</res-type>
30       <res-auth>Container</res-auth>
31   </resource-ref>
32   
33   <!--SQLServer数据库JNDI数据源引用 -->
34   <resource-ref>
35       <description>SQLServer DB Connection</description>
36       <res-ref-name>jdbc/SqlServerDataSource</res-ref-name>
37       <res-type>javax.sql.DataSource</res-type>
38       <res-auth>Container</res-auth>
39   </resource-ref>
40   
41 </web-app>
复制代码

  3.部署C3P0_JNDI_Config Web应用到Tomcat服务器测试JNDI数据源

  

  部署到tomcat服务器的webapps目录之后,tomcat服务器就会自动在\conf\Catalina\localhost目录下生成一个C3P0_JNDI_Config.xml文件,如下图所示:

  

  C3P0_JNDI_Config.xml文件中的内容就是我们在META-INF目录的context.xml文件中配置的那些内容。

  jsp测试页面如下:

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入JSTL标签库 --%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
 5 <!DOCTYPE HTML>
 6 <html>
 7   <head>
 8     <title>C3P0配置JNDI数据源连接测试</title>
 9   </head>
10   
11   <body>
12         <h3>针对MySQL数据库JNDI数据源测试</h3>
13         <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
14         <sql:query var="rs" dataSource="jdbc/MysqlDataSource">
15             <%--MySQL JNDI数据源测试 SQL--%>
16              select * from ld_user
17         </sql:query>
18         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
19         <c:forEach var="row" items="${rs.rows}">
20             <%--${row.字段名}获取字段的值--%>
21             ${row.id}---${row.username}---${row.password}<br/>
22         </c:forEach>
23         <hr/>
24         <h3>针对Oracle数据库JNDI数据源测试</h3>
25           <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
26         <sql:query var="rs" dataSource="jdbc/OracleDataSource">
27             <%--Oracle JNDI数据源测试 SQL--%>
28             SELECT * FROM LEAD_OAMS_DBSOURCES
29         </sql:query>
30         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
31         <c:forEach var="row" items="${rs.rows}">
32             <%--${row.字段名}获取字段的值--%>
33             ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}<br/>
34         </c:forEach>
35         <hr/>
36   </body>
37 </html>
复制代码

 C3P0 自动重连相关参数
     idleConnectionTestPeriod:C3P0会有一个Task检测pool内的连接是否正常,此参数就是Task运行的频率。默认值为0,表示不进行检测
    acquireRetryAttempts:pool请求取新连接失败后重试的次数
     C3P0目前存在问题:
     当数据库重启后,C3P0不会自动重新初始化数据库连接池,当新的请求需要访问数据库的时候,此时回报错误(因为数据库重启,连接失效),同时刷新数据库连接池,丢弃掉已经失效的连接,当第二个请求到来时恢复正常。
  C3P0目前没有提供当获取已建立连接失败后重试次数的参数,只有获取新连接失败后重试次数的参数(acquireRetryAttempts )。
要解决此问题,可以通过设置idleConnectionTestPeriod 参数折中解决,该参数的作用是设置系统自动检查连接池中连接是否正常的一个频率参数,时间单位是秒。

 

JNDI学习总结()——Tomcat下使用Druid配置JNDI数据源

  com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置。

一、下载Druid的jar包

  下载地址:http://mvnrepository.com/artifact/com.alibaba/druid/1.0.9,如下图所示:

  

  druid.jar依赖log4j的jar包,所以还需要下载log4j的jar包。

  log4j的下载地址如下:http://mvnrepository.com/artifact/log4j/log4j/1.2.17,如下图所示:

  

二、使用Druid配置JNDI数据源

2.1、前期准备工作

  创建一个Web测试项目Druid_JNDI_Config,将下载下来druid-1.0.9.jar和log4j-1.2.17.jar添加到项目中,在项目的META-INF目录下创建一个context.xml文件

  目录结构如下图所示:

  

  在tomcat服务器的lib目录下添加Oracle、MySQL、SQLServer种数据库的驱动jar包,如下图所示:

  

2.2、在context.xml文件中加入JNDI的配置信息

  在context.xml文件中加入如下配置信息

复制代码
 1 <Context>
 2     <!-- 使用阿里巴巴的DruidDataSource配置针对Oracle数据库的JNDI数据源 -->
 3     <Resource 
 4         name="jdbc/OracleDataSource"
 5         factory="com.alibaba.druid.pool.DruidDataSourceFactory"
 6         auth="Container"
 7         type="javax.sql.DataSource"
 8         driverClassName="oracle.jdbc.OracleDriver"
 9         url="jdbc:oracle:thin:@192.168.1.229:1521:lead"
10         username="lead_oams"
11         password="p"
12         maxActive="50"
13         maxWait="10000"
14         removeabandoned="true"
15         removeabandonedtimeout="60"
16         logabandoned="false"
17         filters="stat"/>
18         
19     <!-- 使用阿里巴巴的DruidDataSource配置针对MySQL数据库的JNDI数据源 -->
20      <Resource 
21         name="jdbc/MysqlDataSource"
22         factory="com.alibaba.druid.pool.DruidDataSourceFactory"
23         auth="Container"
24         type="javax.sql.DataSource"
25         driverClassName="com.mysql.jdbc.Driver"
26         url="jdbc:mysql://192.168.1.233:3306/lead_oams?useUnicode=true&amp;characterEncoding=utf-8"
27         username="lead_system"
28         password="password"
29         maxActive="50"
30         maxWait="10000"
31         removeabandoned="true"
32         removeabandonedtimeout="60"
33         logabandoned="false"
34         filters="stat"/>
35         
36     <!--使用阿里巴巴的DruidDataSource配置针对SQLServer数据库的JNDI数据源-->
37     <Resource 
38         name="jdbc/SqlServerDataSource"
39         auth="Container"
40         factory="com.alibaba.druid.pool.DruidDataSourceFactory" 
41         type="javax.sql.DataSource"
42         driverClass="com.microsoft.sqlserver.jdbc.SQLServerDriver"
43         url="jdbc:sqlserver://192.168.1.61:1433;DatabaseName=gaclTest"
44         username="sa" 
45         password="p@ssw0rd"
46         maxActive="50"
47         maxWait="10000"
48         removeabandoned="true"
49         removeabandonedtimeout="60"
50         logabandoned="false"
51         filters="stat"/>
52 </Context>
复制代码

   配置项中指定了各个参数后,在连接池内部是这么使用这些参数的。数据库连接池在初始化的时候会创建initialSize个连接,当有数据库操作时,会从池中取出一个连接。如果当前池中正在使用的连接数等于maxActive,则会等待一段时间,等待其他操作释放掉某一个连接,如果这个等待时间超过了maxWait,则会报错;如果当前正在使用的连接数没有达到maxActive,则判断当前是否空闲连接,如果有则直接使用空闲连接,如果没有则新建立一个连接。在连接使用完毕后,不是将其物理连接关闭,而是将其放入池中等待其他操作复用。同时连接池内部有机制判断,如果当前的总的连接数少于miniIdle,则会建立新的空闲连接,以保证连接数得到miniIdle。如果当前连接池中某个连接在空闲了timeBetweenEvictionRunsMillis时间后任然没有使用,则被物理性的关闭掉。有些数据库连接的时候有超时限制(mysql连接在8小时后断开),或者由于网络中断等原因,连接池的连接会出现失效的情况,这时候设置一个testWhileIdle参数为true,可以保证连接池内部定时检测连接的可用性,不可用的连接会被抛弃或者重建,最大情况的保证从连接池中得到的Connection对象是可用的。当然,为了保证绝对的可用性,你也可以使用testOnBorrow为true(即在获取Connection对象时检测其可用性),
不过这样会影响性能。

2.3、在web.xml引用JDNI数据源

  在web.xml文件中加入如下的配置引用JNDI数据源

复制代码
 1 <?xml version="1.0" encoding="UTF-8"?>
 2 <web-app version="2.5" 
 3     xmlns="http://java.sun.com/xml/ns/javaee" 
 4     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 5     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
 6     http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
 7   <welcome-file-list>
 8     <welcome-file>index.jsp</welcome-file>
 9   </welcome-file-list>
10   
11   <!-- 
12       JNDI配置的资源引用:
13   �6�1 res-ref-name:表示引用资源的名称
14   �6�1 res-type:此资源对应的类型为javax.sql.DataSource
15   �6�1 res-auth:容器授权管理
16    -->
17    <!--Oracle数据库JNDI数据源引用 -->
18   <resource-ref>
19       <description>Oracle DB Connection</description>
20       <res-ref-name>jdbc/OracleDataSource</res-ref-name>
21       <res-type>javax.sql.DataSource</res-type>
22       <res-auth>Container</res-auth>
23  </resource-ref>
24   
25   <!--MySQL数据库JNDI数据 -->
26   <resource-ref>
27       <description>MySQL DB Connection</description>
28       <res-ref-name>jdbc/MysqlDataSource</res-ref-name>
29       <res-type>javax.sql.DataSource</res-type>
30       <res-auth>Container</res-auth>
31   </resource-ref>
32   
33    <!--SQLServer数据库JNDI数据源引用 -->
34   <resource-ref>
35       <description>SQLServer DB Connection</description>
36       <res-ref-name>jdbc/SqlServerDataSource</res-ref-name>
37       <res-type>javax.sql.DataSource</res-type>
38       <res-auth>Container</res-auth>
39   </resource-ref>
40 </web-app>
复制代码

2.4、测试JNDI数据源

  部署Druid_JNDI_Config Web应用到Tomcat服务器测试JNDI数据源,如下图所示:

  

  部署到tomcat服务器的webapps目录之后,tomcat服务器就会自动在\conf\Catalina\localhost目录下生成一个Druid_JNDI_Config.xml文件,如下图所示:

  

  Druid_JNDI_Config.xml文件中的内容就是我们在META-INF目录的context.xml文件中配置的那些内容。

  jsp测试页面如下:

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入JSTL标签库 --%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 4 <%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql"%>
 5 <!DOCTYPE HTML>
 6 <html>
 7   <head>
 8     <title>DRUID配置JNDI数据源连接测试</title>
 9   </head>
10   
11   <body>
12     <h3>针对MySQL数据库JNDI数据源测试</h3>
13         <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
14         <sql:query var="rs" dataSource="jdbc/MysqlDataSource">
15             <%--MySQL JNDI数据源测试 SQL--%>
16              select * from lead_oams_applications
17         </sql:query>
18         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
19         <c:forEach var="row" items="${rs.rows}">
20             <%--${row.字段名}获取字段的值--%>
21             ${row.resourceid}---${row.app_name}<br/>
22         </c:forEach>
23         <hr/>
24         <h3>针对Oracle数据库JNDI数据源测试</h3>
25           <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
26         <sql:query var="rs" dataSource="jdbc/OracleDataSource">
27             <%--Oracle JNDI数据源测试 SQL--%>
28             SELECT * FROM LEAD_OAMS_DBSOURCES
29         </sql:query>
30         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
31         <c:forEach var="row" items="${rs.rows}">
32             <%--${row.字段名}获取字段的值--%>
33             ${row.RESOURCEID}---${row.DBSOURCE_NAME}---${row.DBSOURCE_TYPE}<br/>
34         </c:forEach>
35         <hr/>
36         <h3>SQLServer JNDI数据源测试</h3>
37         <%--使用sql:query标签发送SQL语句去数据库查询数据,查询的结果集保存到rs变量当中,dataSource属性指明使用的数据源--%>
38         <sql:query var="rs" dataSource="jdbc/SqlServerDataSource">
39             <%--SQLServer JNDI数据源测试 SQL--%>
40             select * from t_demo
41         </sql:query>
42         <%--使用c:forEach标签遍历查询结果集rs中的每一行--%>
43         <c:forEach var="row" items="${rs.rows}">
44             <%--${row.字段名}获取字段的值--%>
45             ${row.id}---${row.name}<br/>
46         </c:forEach>
47   </body>
48 </html>
复制代码

  运行结果如下:

  

、在Java代码中获取JNDI中的数据源

3.1、获取JNDI中的数据源

  编写一个JdbcUtil工具类,JdbcUtil工具类负责从JNDI容器中获取DataSource,再通过DataSource获取数据库连接。

代码如下:

复制代码
  1 package me.gacl.util;
  2 
  3 /**
  4  * <p>ClassName: JdbcUtil<p>
  5  * <p>Description: 从JNDI容器中获取DataSource,再通过DataSource获取数据库连接<p>
  6  */
  7 import java.sql.Connection;
  8 import java.sql.ResultSet;
  9 import java.sql.SQLException;
 10 import java.sql.Statement;
 11 import javax.naming.Context;
 12 import javax.naming.InitialContext;
 13 import javax.naming.NamingException;
 14 import com.alibaba.druid.pool.DruidDataSource;
 15 
 16 public class JdbcUtil {
 17     
 18 /*
 19  web.xml文件中的JNDI数据源引用配置
 20  
 21   <!--Oracle数据库JNDI数据源引用 -->
 22   <resource-ref>
 23       <description>Oracle DB Connection</description>
 24       <res-ref-name>jdbc/OracleDataSource</res-ref-name>
 25       <res-type>javax.sql.DataSource</res-type>
 26       <res-auth>Container</res-auth>
 27  </resource-ref>
 28   
 29   <!--MySQL数据库JNDI数据 -->
 30   <resource-ref>
 31       <description>MySQL DB Connection</description>
 32       <res-ref-name>jdbc/MysqlDataSource</res-ref-name>
 33       <res-type>javax.sql.DataSource</res-type>
 34       <res-auth>Container</res-auth>
 35   </resource-ref>
 36   
 37    <!--SQLServer数据库JNDI数据源引用 -->
 38   <resource-ref>
 39       <description>SQLServer DB Connection</description>
 40       <res-ref-name>jdbc/SqlServerDataSource</res-ref-name>
 41       <res-type>javax.sql.DataSource</res-type>
 42       <res-auth>Container</res-auth>
 43   </resource-ref>
 44 */
 45     
 46     //Oracle数据库配置的JNDI数据源连接名,后面跟的是DataSource名,DataSource名在web.xml文件中的<res-ref-name></res-ref-name>进行了配置
 47     private static final String ORACLE_DB_JNDINAME = "java:comp/env/jdbc/OracleDataSource";
 48     //MySQL数据库配置的JNDI数据源连接名,java:comp/env是必须加的,后面跟的是DataSource名
 49     private static final String MYSQL_DB_JNDINAME = "java:comp/env/jdbc/MysqlDataSource";
 50     //SQLServer数据库配置的JNDI数据源连接名,java:comp/env是必须加的,后面跟的是DataSource名
 51     private static final String SQLSERVER_DB_JNDINAME = "java:comp/env/jdbc/SqlServerDataSource";
 52     
 53     private static DruidDataSource dsOracle = null;
 54     private static DruidDataSource dsMySql = null;
 55     private static DruidDataSource dsSqlServer = null;
 56     
 57     static{
 58         try {
 59             //1、初始化名称查找上下文
 60             Context ctx = new InitialContext();
 61             //2、通过JNDI名称找到DataSource
 62             dsOracle = (DruidDataSource) ctx.lookup(ORACLE_DB_JNDINAME);
 63             dsMySql = (DruidDataSource) ctx.lookup(MYSQL_DB_JNDINAME);
 64             dsSqlServer = (DruidDataSource) ctx.lookup(SQLSERVER_DB_JNDINAME);
 65         } catch (NamingException e) {
 66             e.printStackTrace();
 67         }
 68     }
 69 
 70     /**
 71      * MethodName: getOracleConnection
 72      * Description: 获取Oracle数据库连接
 73      * @author xudp        
 74      * @return
 75      * @throws SQLException
 76      */
 77     public static Connection getOracleConnection() throws SQLException {
 78         return dsOracle.getConnection();
 79     }
 80     
 81     /**
 82      * MethodName: getMySqlConnection
 83      * Description: 获取MySQL数据库连接
 84      * @author xudp        
 85      * @return
 86      * @throws SQLException
 87      */
 88     public static Connection getMySqlConnection() throws SQLException {
 89         return dsMySql.getConnection();
 90     }
 91     
 92     /**
 93      * MethodName: getSqlServerConnection
 94      * Description: 获取SQLServer数据库连接
 95      * @author xudp        
 96      * @return
 97      * @throws SQLException
 98      */
 99     public static Connection getSqlServerConnection() throws SQLException {
100         return dsSqlServer.getConnection();
101     }
102 
103     /**
104     * @Method: release
105     * @Description: 释放资源,
106     *     要释放的资源包括Connection数据库连接对象,负责执行SQL命令的Statement对象,存储查询结果的ResultSet对象
107     * @Anthor:孤傲苍狼
108     *
109     * @param conn
110     * @param st
111     * @param rs
112     */ 
113     public static void release(Connection conn,Statement st,ResultSet rs){
114         if(rs!=null){
115             try{
116                 //关闭存储查询结果的ResultSet对象
117                 rs.close();
118             }catch (Exception e) {
119                 e.printStackTrace();
120             }
121             rs = null;
122         }
123         if(st!=null){
124             try{
125                 //关闭负责执行SQL命令的Statement对象
126                 st.close();
127             }catch (Exception e) {
128                 e.printStackTrace();
129             }
130         }
131         
132         if(conn!=null){
133             try{
134                 //关闭Connection数据库连接对象
135                 conn.close();
136             }catch (Exception e) {
137                 e.printStackTrace();
138             }
139         }
140     }
141 }
复制代码

3.2、测试JNDI数据源

  编写一个测试的Servlet,测试代码如下:

复制代码
  1 package me.gacl.test;
  2 
  3 import java.io.IOException;
  4 import java.sql.Connection;
  5 import java.sql.PreparedStatement;
  6 import java.sql.ResultSet;
  7 import java.sql.SQLException;
  8 import java.util.ArrayList;
  9 import java.util.LinkedHashMap;
 10 import java.util.List;
 11 import java.util.Map;
 12 import javax.servlet.ServletException;
 13 import javax.servlet.http.HttpServlet;
 14 import javax.servlet.http.HttpServletRequest;
 15 import javax.servlet.http.HttpServletResponse;
 16 import me.gacl.util.JdbcUtil;
 17 
 18 /**
 19  * <p>ClassName: JNDITestServlet<p>
 20  * <p>Description: <p>
 21  * <p>Company:广州利迪网络科技有限公司 <p>    
 22  * @author xudp
 23  * @version 1.0 V
 24  * @createTime 2014-10-23 上午09:32:52
 25  */
 26 public class JNDITestServlet extends HttpServlet {
 27 
 28     public void doGet(HttpServletRequest request, HttpServletResponse response)
 29             throws ServletException, IOException {
 30         
 31         //Oracle数据库连接
 32         Connection oracleConnection = null;
 33         //MySql数据库连接
 34         Connection mySqlConnection = null;
 35         //SQLServer数据库连接
 36         Connection sqlServerConnection = null;
 37         
 38         //负责执行SQL的PreparedStatement对象
 39         PreparedStatement pstmtOracle = null;
 40         PreparedStatement pstmtMySQL = null;
 41         PreparedStatement pstmtSqlServer = null;
 42         
 43         //查询出来的结果集
 44         ResultSet rsOracle = null;
 45         ResultSet rsMySQL = null;
 46         ResultSet rsSqlServer = null;
 47         
 48         //存储查询出来的数据,每一行数据映射成一个Map,字段名作为key,字段的值作为value
 49         List<Map<String, String>> oracleDataList = new ArrayList<Map<String, String>>();
 50         List<Map<String, String>> mySqlDataList = new ArrayList<Map<String, String>>();
 51         List<Map<String, String>> sqlServerDataList = new ArrayList<Map<String, String>>();
 52         
 53         try {
 54             
 55             //获取Oracle数据库连接
 56              oracleConnection = JdbcUtil.getOracleConnection();
 57             //获取MySql数据库连接
 58              mySqlConnection = JdbcUtil.getMySqlConnection();
 59             //获取SQLServer数据库连接
 60              sqlServerConnection =JdbcUtil.getSqlServerConnection();
 61             
 62              String oracleDb_Sql = "SELECT * FROM LEAD_OAMS_DBSOURCES";
 63              String mySqlDb_Sql = "SELECT * FROM LEAD_OAMS_APPLICATIONS";
 64              String sqlServerDb_Sql = "SELECT * FROM T_DEMO";
 65                 
 66              pstmtOracle = oracleConnection.prepareStatement(oracleDb_Sql);
 67              pstmtMySQL = mySqlConnection.prepareStatement(mySqlDb_Sql);
 68              pstmtSqlServer = sqlServerConnection.prepareStatement(sqlServerDb_Sql);
 69             
 70              //执行查询,查询结果存储到ResultSet结果集中
 71              rsOracle = pstmtOracle.executeQuery();
 72              rsMySQL = pstmtMySQL.executeQuery();
 73              rsSqlServer = pstmtSqlServer.executeQuery();
 74             
 75             //循环结果集中的数据 
 76             while(rsOracle.next()){
 77                 Map<String, String> oracleDataMap = new LinkedHashMap<String, String>();
 78                 //取出结果集中的数据,每一行数据映射成一个map集合
 79                 oracleDataMap.put("resourceid", rsOracle.getString("RESOURCEID"));
 80                 oracleDataMap.put("dbsource_name", rsOracle.getString("DBSOURCE_NAME"));
 81                 oracleDataMap.put("dbsource_type", rsOracle.getString("DBSOURCE_TYPE"));
 82                 //将代表每一行数据的Map集合添加到List集合中
 83                 oracleDataList.add(oracleDataMap);
 84             }
 85             
 86             while(rsMySQL.next()){
 87                 Map<String, String> mySqlDataMap = new LinkedHashMap<String, String>();
 88                 mySqlDataMap.put("resourceid", rsMySQL.getString("resourceid"));
 89                 mySqlDataMap.put("app_name", rsMySQL.getString("app_name"));
 90                 mySqlDataList.add(mySqlDataMap);
 91             }
 92             
 93             while(rsSqlServer.next()){
 94                 Map<String, String> sqlServerDataMap = new LinkedHashMap<String, String>();
 95                 sqlServerDataMap.put("id", rsSqlServer.getString("id"));
 96                 sqlServerDataMap.put("name", rsSqlServer.getString("name"));
 97                 sqlServerDataList.add(sqlServerDataMap);
 98             }
 99             
100             //将数据集合存储到request对象发送到页面进行显示
101             request.setAttribute("oracleDataList", oracleDataList);
102             request.setAttribute("mySqlDataList", mySqlDataList);
103             request.setAttribute("sqlServerDataList", sqlServerDataList);
104             //跳转到JNDITest.jsp页面显示数据
105             request.getRequestDispatcher("/JNDITest.jsp").forward(request, response);
106             
107         } catch (SQLException e) {
108             e.printStackTrace();
109         }finally{
110             //释放资源
111             JdbcUtil.release(oracleConnection, pstmtOracle, rsOracle);
112             JdbcUtil.release(mySqlConnection, pstmtMySQL, rsMySQL);
113             JdbcUtil.release(sqlServerConnection, pstmtSqlServer, rsSqlServer);
114         }
115     }
116     
117     public void doPost(HttpServletRequest request, HttpServletResponse response)
118             throws ServletException, IOException {
119         doGet(request,response);
120     }
121 }
复制代码

  JNDITest.jsp页面代码如下:

复制代码
 1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
 2 <%--引入JSTL标签库 --%>
 3 <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
 4 <!DOCTYPE HTML>
 5 <html>
 6   <head>
 7     <title>JNDI测试</title>
 8   </head>
 9   
10   <body>
11         <h3>从Oracle数据库中取出来的数据</h3>
12         <%--使用c:forEach标签遍历List集合--%>
13         <c:forEach var="oracleDataMap" items="${oracleDataList}">
14             ${oracleDataMap.resourceid}---${oracleDataMap.dbsource_name}---${oracleDataMap.dbsource_type}<br/>
15         </c:forEach>
16         <hr/>
17         <h3>从mySql数据库中取出来的数据</h3>
18         <%--使用c:forEach标签遍历List集合--%>
19         <c:forEach var="mySqlDataMap" items="${mySqlDataList}">
20             ${mySqlDataMap.resourceid}---${mySqlDataMap.app_name}<br/>
21         </c:forEach>
22         <hr/>
23         <h3>从sqlServer数据库中取出来的数据</h3>
24         <%--使用c:forEach标签遍历List集合--%>
25         <c:forEach var="sqlServerDataMap" items="${sqlServerDataList}">
26             ${sqlServerDataMap.id}---${sqlServerDataMap.name}<br/>
27         </c:forEach>
28   </body>
29 </html>
复制代码

  运行结果如下:

 

 

猜你喜欢

转载自chenggong1220.iteye.com/blog/2364571