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

源自:http://www.cnblogs.com/xdp-gacl/p/4040103.html

一、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 參數折中解決,該參數的作用是設置系統自動檢查連接池中連接是否正常的一個頻率參數,時間單位是秒。


發佈了4 篇原創文章 · 獲贊 19 · 訪問量 39萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章