天天看點

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

一、C3P0下載下傳

  C3P0下載下傳位址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  下載下傳完成之後得到一個壓縮包

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

二、使用C3P0配置JNDI資料源

  Tomcat6.x中配置JNDI資料源時預設使用的是Tomcat6.x自帶的DBCP連接配接池,Tomcat6.x使用DBCP連接配接池配置JNDI資料源如下:

JNDI學習總結(二)——Tomcat下使用C3P0配置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"/>      
JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  如果想讓Tomcat6.x使用C3P0連接配接池配置JNDI資料源,在配置時,以下配置項需要修改

  1、 type和factory的值發生變化

  2、username=>user

  3、url=>jdbcUrl

  4、driverClassName=>driverClass

  建立一個Web測試項目C3P0_JNDI_Config,解壓

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

壓縮包,找到c3p0-0.9.5-pre9\lib目錄下的相關Jar包如下圖所示:

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  将C3P0的相關Jar包添加到項目中,在項目的META-INF目錄下建立一個context.xml檔案,目錄結構如下圖所示:

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  在tomcat伺服器的lib目錄下添加Oracle、MySQL、SQLServer三種資料庫的驅動jar包,如下圖所示:

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  1、在context.xml檔案中加入如下配置資訊

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源
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="[email protected]"/>
47 </Context>      
JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  2.在web.xml引用JDNI資料源:

JNDI學習總結(二)——Tomcat下使用C3P0配置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   • 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>      
JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  3.部署C3P0_JNDI_Config Web應用到Tomcat伺服器測試JNDI資料源

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  部署到tomcat伺服器的webapps目錄之後,tomcat伺服器就會自動在\conf\Catalina\localhost目錄下生成一個C3P0_JNDI_Config.xml檔案,如下圖所示:

  

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

  C3P0_JNDI_Config.xml檔案中的内容就是我們在META-INF目錄的context.xml檔案中配置的那些内容。

  jsp測試頁面如下:

JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源
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>      
JNDI學習總結(二)——Tomcat下使用C3P0配置JNDI資料源

 C3P0 自動重連相關參數

     idleConnectionTestPeriod:C3P0會有一個Task檢測pool内的連接配接是否正常,此參數就是Task運作的頻率。預設值為0,表示不進行檢測

    acquireRetryAttempts:pool請求取新連接配接失敗後重試的次數

     C3P0目前存在問題:

     當資料庫重新開機後,C3P0不會自動重新初始化資料庫連接配接池,當新的請求需要通路資料庫的時候,此時回報錯誤(因為資料庫重新開機,連接配接失效),同時重新整理資料庫連接配接池,丢棄掉已經失效的連接配接,當第二個請求到來時恢複正常。

  C3P0目前沒有提供當擷取已建立連接配接失敗後重試次數的參數,隻有擷取新連接配接失敗後重試次數的參數(acquireRetryAttempts )。

要解決此問題,可以通過設定idleConnectionTestPeriod 參數折中解決,該參數的作用是設定系統自動檢查連接配接池中連接配接是否正常的一個頻率參數,時間機關是秒。

繼續閱讀