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