一、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="[email protected]"/>
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 參數折中解決,該參數的作用是設定系統自動檢查連接配接池中連接配接是否正常的一個頻率參數,時間機關是秒。