java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解
數(shù)據(jù)庫連接池C3P0框架是個(gè)非常優(yōu)異的開源jar,高性能的管理著數(shù)據(jù)源,這里只討論程序本身負(fù)責(zé)數(shù)據(jù)源,不討論容器管理。
-------------------------------------------------------------------------------------------------------------------------------------------
c3p0的配置方式分為三種,分別是
1.setters一個(gè)個(gè)地設(shè)置各個(gè)配置項(xiàng)(不推薦)
2.類路徑下提供一個(gè)c3p0.properties文件
3.類路徑下提供一個(gè)c3p0-config.xml文件
一、實(shí)現(xiàn)方式:
1.自己動(dòng)手寫代碼,實(shí)現(xiàn)數(shù)據(jù)源(setters一個(gè)個(gè)地設(shè)置各個(gè)配置項(xiàng))
例如:在類路徑下配置一個(gè)屬性文件,config.properties,內(nèi)容如下:
driverClass=xxx
jdbcUrl=xxx
user=xxx
password=xxx
...
然后代碼中實(shí)現(xiàn)
Properties props = new Properties();
InputStream in = Thread.class.getResourceAsStream("config.properties");
props.load(in);
in.close();
ComboPooledDataSource cpds = new ComboPooledDataSource();
cpds.setDriverClass(props.getProperty("driverClass"));
cpds.setJdbcUrl(props.getProperty("jdbcUrl"));
cpds.setUser(props.getProperty("user"));
cpds.setPassword(props.getProperty("password"));
...
這里實(shí)現(xiàn)了一個(gè)數(shù)據(jù)源。
也可以這樣配置,在類路徑下配置一個(gè)xml文件,config.xml
root
xxx
xxx
xxx
...
然后自己解析xml文件,這樣可以實(shí)現(xiàn)多個(gè)數(shù)據(jù)源的配置。
---------------------------------------------------------------------------------------------------------------------------------------------------
2.配置默認(rèn)的熟悉文件
類路徑下提供一個(gè)c3p0.properties文件(不能改名)
配置如下:
c3p0.driverClass=com.mysql.jdbc.Driver
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
c3p0.user=root
c3p0.password=java
...
上面只提供了最基本的配置項(xiàng),其他配置項(xiàng)參照文章后面的文檔配置,記得是c3p0.后面加屬性名就是了,最后初始化數(shù)據(jù)源的方式就是這樣簡(jiǎn)單:
...
DataSource ?ds = new ComboPooledDataSource();
return ds;
獲得數(shù)據(jù)庫鏈接 ?return ds.getConnection()
...
然后就可以使用數(shù)據(jù)源了,C3P0會(huì)對(duì)c3p0.properties進(jìn)行自動(dòng)解析的
-------------------------------------------------------------------------------------------------------------------------------------------------------
3.路徑下提供一個(gè)c3p0-config.xml文件
這種方式使用方式與第二種差不多,但是有更多的優(yōu)點(diǎn)
(1).更直觀明顯,很類似hibernate和spring的配置
(2).可以為多個(gè)數(shù)據(jù)源服務(wù),提供default-config和named-config兩種配置方式
root
java
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/jdbc
10
30
100
10
root
java
com.mysql.jdbc.Driver
jdbc:mysql://localhost:3306/jdbc
10
30
100
10
...
DataSource ?ds = new ComboPooledDataSource("mySource");
return ds;//獲得數(shù)據(jù)源
獲得數(shù)據(jù)庫鏈接 return ds.getConnection()
...
這樣就可以使用數(shù)據(jù)源了。
下面給出第三種方式的例子代碼:
a. src下面的創(chuàng)建的c3p0-confit.xml文件
sa
com.microsoft.jdbc.sqlserver.SQLServerDriver
jdbc:microsoft:sqlserver://192.168.0.252:6252;databasename=szWq
10
30
100
10
b.獲取數(shù)據(jù)庫連接的幫助類DBConn.java
import java.sql.*;importcom.mchange.v2.c3p0.ComboPooledDataSource;/**********************************************
* 功能: 鏈接數(shù)據(jù)庫代碼
**********************************************/
public classDBConn {private static ComboPooledDataSource ds = newComboPooledDataSource();//取得鏈接
public staticConnection getConn() {try{returnds.getConnection();
}catch(SQLException e) {throw newRuntimeException(e);
}
}//關(guān)閉鏈接
public static void close(Connection conn) throwsSQLException {if (conn != null) {try{
conn.close();
}catch(SQLException e) {
e.printStackTrace();throwe;
}
}
}public static void close(PreparedStatement pstate) throwsSQLException {if(pstate!=null){
pstate.close();
}
}public static void close(ResultSet rs) throwsSQLException {if(rs!=null){
rs.close();
}
}
}
二、部分參數(shù)配置說明:
1.最常用配置
initialPoolSize:連接池初始化時(shí)創(chuàng)建的連接數(shù),default : 3(建議使用)
minPoolSize:連接池保持的最小連接數(shù),default : 3(建議使用)
maxPoolSize:連接池中擁有的最大連接數(shù),如果獲得新連接時(shí)會(huì)使連接總數(shù)超過這個(gè)值則不會(huì)再獲取新連接,而是等待其他連接釋放,所以這個(gè)值有可能會(huì)設(shè)計(jì)地很大,default : 15(建議使用)
acquireIncrement:連接池在無空閑連接可用時(shí)一次性創(chuàng)建的新數(shù)據(jù)庫連接數(shù),default : 3(建議使用)
2.管理連接池的大小和連接的生存時(shí)間
maxConnectionAge:配置連接的生存時(shí)間,超過這個(gè)時(shí)間的連接將由連接池自動(dòng)斷開丟棄掉。當(dāng)然正在使用的連接不會(huì)馬上斷開,而是等待它c(diǎn)lose再斷開。配置為0的時(shí)候則不會(huì)對(duì)連接的生存時(shí)間進(jìn)行限制。default : 0 單位 s(不建議使用)
maxIdleTime:連接的最大空閑時(shí)間,如果超過這個(gè)時(shí)間,某個(gè)數(shù)據(jù)庫連接還沒有被使用,則會(huì)斷開掉這個(gè)連接。如果為0,則永遠(yuǎn)不會(huì)斷開連接,即回收此連接。default : 0 單位 s(建議使用)
maxIdleTimeExcessConnections:這個(gè)配置主要是為了快速減輕連接池的負(fù)載,比如連接池中連接數(shù)因?yàn)槟炒螖?shù)據(jù)訪問高峰導(dǎo)致創(chuàng)建了很多數(shù)據(jù)連接,但是后面的時(shí)間段需要的數(shù)據(jù)庫連接數(shù)很少,需要快速釋放,必須小于maxIdleTime。其實(shí)這個(gè)沒必要配置,maxIdleTime已經(jīng)配置了。default : 0 單位 s(不建議使用)
3.配置連接測(cè)試:
automaticTestTable:配置一個(gè)表名,連接池根據(jù)這個(gè)表名用自己的測(cè)試sql語句在這個(gè)空表上測(cè)試數(shù)據(jù)庫連接,這個(gè)表只能由c3p0來使用,用戶不能操作。default : null(不建議使用)
preferredTestQuery:與上面的automaticTestTable二者只能選一。自己實(shí)現(xiàn)一條SQL檢測(cè)語句。default : null(建議使用)
idleConnectionTestPeriod:用來配置測(cè)試空閑連接的間隔時(shí)間。測(cè)試方式還是上面的兩種之一,可以用來解決MySQL8小時(shí)斷開連接的問題。因?yàn)樗WC連接池會(huì)每隔一定時(shí)間對(duì)空閑連接進(jìn)行一次測(cè)試,從而保證有效的空閑連接能每隔一定時(shí)間訪問一次數(shù)據(jù)庫,將于MySQL8小時(shí)無會(huì)話的狀態(tài)打破。為0則不測(cè)試。default : 0(建議使用)
testConnectionOnCheckin:如果為true,則在close的時(shí)候測(cè)試連接的有效性。default : false(不建議使用)
testConnectionOnCheckout:性能消耗大。如果為true,在每次getConnection的時(shí)候都會(huì)測(cè)試,為了提高性能,盡量不要用。default : false(不建議使用)
4.配置PreparedStatement緩存:
maxStatements:連接池為數(shù)據(jù)源緩存的PreparedStatement的總數(shù)。由于PreparedStatement屬于單個(gè)Connection,所以這個(gè)數(shù)量應(yīng)該根據(jù)應(yīng)用中平均連接數(shù)乘以每個(gè)連接的平均PreparedStatement來計(jì)算。同時(shí)maxStatementsPerConnection的配置無效。default : 0(不建議使用)
maxStatementsPerConnection:連接池為數(shù)據(jù)源單個(gè)Connection緩存的PreparedStatement數(shù),這個(gè)配置比maxStatements更有意義,因?yàn)樗彺娴姆?wù)對(duì)象是單個(gè)數(shù)據(jù)連接,如果設(shè)置的好,肯定是可以提高性能的。為0的時(shí)候不緩存。default : 0(看情況而論)
5.重連相關(guān)配置
acquireRetryAttempts:連接池在獲得新連接失敗時(shí)重試的次數(shù),如果小于等于0則無限重試直至連接獲得成功。default : 30(建議使用)
acquireRetryDelay:連接池在獲得新連接時(shí)的間隔時(shí)間。default : 1000 單位ms(建議使用)
breakAfterAcquireFailure:如果為true,則當(dāng)連接獲取失敗時(shí)自動(dòng)關(guān)閉數(shù)據(jù)源,除非重新啟動(dòng)應(yīng)用程序。所以一般不用。default : false(不建議使用)
checkoutTimeout:配置當(dāng)連接池所有連接用完時(shí)應(yīng)用程序getConnection的等待時(shí)間。為0則無限等待直至有其他連接釋放或者創(chuàng)建新的連接,不為0則當(dāng)時(shí)間到的時(shí)候如果仍沒有獲得連接,則會(huì)拋出SQLException。其實(shí)就是acquireRetryAttempts*acquireRetryDelay。default : 0(與上面兩個(gè),有重復(fù),選擇其中兩個(gè)都行)
6.定制管理Connection的生命周期
connectionCustomizerClassName:用來定制Connection的管理,比如在Connection acquire 的時(shí)候設(shè)定Connection的隔離級(jí)別,或者在Connection丟棄的時(shí)候進(jìn)行資源關(guān)閉,
就可以通過繼承一個(gè)AbstractConnectionCustomizer來實(shí)現(xiàn)相關(guān)方法,配置的時(shí)候使用全類名。有點(diǎn)類似監(jiān)聽器的作用。default : null(不建議使用)
7.配置未提交的事務(wù)處理
autoCommitOnClose:連接池在回收數(shù)據(jù)庫連接時(shí)是否自動(dòng)提交事務(wù)。如果為false,則會(huì)回滾未提交的事務(wù),如果為true,則會(huì)自動(dòng)提交事務(wù)。default : false(不建議使用)
forceIgnoreUnresolvedTransactions:這個(gè)配置強(qiáng)烈不建議為true。default : false(不建議使用)
一般來說事務(wù)當(dāng)然由自己關(guān)閉了,為什么要讓連接池來處理這種不細(xì)心問題呢?
8.配置debug和回收Connection
unreturnedConnectionTimeout:為0的時(shí)候要求所有的Connection在應(yīng)用程序中必須關(guān)閉。如果不為0,則強(qiáng)制在設(shè)定的時(shí)間到達(dá)后回收Connection,所以必須小心設(shè)置,保證在回收之前所有數(shù)據(jù)庫操作都能夠完成。這種限制減少Connection未關(guān)閉情況的不是很適用。建議手動(dòng)關(guān)閉。default : 0 單位 s(不建議使用)
debugUnreturnedConnectionStackTraces:如果為true并且unreturnedConnectionTimeout設(shè)為大于0的值,當(dāng)所有被getConnection出去的連接unreturnedConnectionTimeout時(shí)間到的時(shí)候,就會(huì)打印出堆棧信息。只能在debug模式下適用,因?yàn)榇蛴《褩P畔?huì)減慢getConnection的速度default : false(不建議使用)
其他配置項(xiàng):因?yàn)橛行┡渲庙?xiàng)幾乎沒有自己配置的必要,使用默認(rèn)值就好,所以沒有再寫出來。
三、示例:
示例采用第二種方式:
1.c3p0.properties:
#驅(qū)動(dòng)
c3p0.driverClass=com.mysql.jdbc.Driver
#地址
c3p0.jdbcUrl=jdbc:mysql://localhost:3306/jdbc
#用戶名
c3p0.user=root
#密碼
c3p0.password=lovejava
#-------------------------------#連接池初始化時(shí)創(chuàng)建的連接數(shù)
c3p0.initialPoolSize=3#連接池保持的最小連接數(shù)
c3p0.minPoolSize=3#連接池在無空閑連接可用時(shí)一次性創(chuàng)建的新數(shù)據(jù)庫連接數(shù),default:3c3p0.acquireIncrement=3#連接池中擁有的最大連接數(shù),如果獲得新連接時(shí)會(huì)使連接總數(shù)超過這個(gè)值則不會(huì)再獲取新連接,而是等待其他連接釋放,所以這個(gè)值有可能會(huì)設(shè)計(jì)地很大,default : 15c3p0.maxPoolSize=15#連接的最大空閑時(shí)間,如果超過這個(gè)時(shí)間,某個(gè)數(shù)據(jù)庫連接還沒有被使用,則會(huì)斷開掉這個(gè)連接,單位秒
c3p0.maxIdleTime=100#連接池在獲得新連接失敗時(shí)重試的次數(shù),如果小于等于0則無限重試直至連接獲得成功
c3p0.acquireRetryAttempts=30#連接池在獲得新連接時(shí)的間隔時(shí)間
c3p0.acquireRetryDelay=1000
2.ConnectionPool
packagecom.study.pool;importjava.sql.Connection;importjava.sql.SQLException;importjavax.sql.DataSource;importcom.mchange.v2.c3p0.ComboPooledDataSource;public classConnectionPool {privateDataSource ds;private staticConnectionPool pool;privateConnectionPool(){
ds= newComboPooledDataSource();
}public static finalConnectionPool getInstance(){if(pool==null){try{
pool= newConnectionPool();
}catch(Exception e) {
e.printStackTrace();
}
}returnpool;
}public synchronized finalConnection getConnection() {try{returnds.getConnection();
}catch(SQLException e) {
e.printStackTrace();
}return null;
}
}
3.PoolThread
packagecom.study.pool;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.ResultSet;importjava.sql.SQLException;public class PoolThread extendsThread {
@Overridepublic voidrun(){
ConnectionPool pool=ConnectionPool.getInstance();
Connection con= null;
PreparedStatement stmt= null;
ResultSet rs= null;try{
con=pool.getConnection();
stmt= con.prepareStatement("select sysdate as nowtime from dual");
rs=stmt.executeQuery();while(rs.next()){
System.out.println(Thread.currentThread().getId()+"---------------開始"+rs.getString("nowtime"));
}
}catch(Exception e) {
e.printStackTrace();
}finally{try{
rs.close();
stmt.close();
con.close();
}catch(SQLException e) {
e.printStackTrace();
}
}
System.out.println(Thread.currentThread().getId()+"--------結(jié)束");
}
}
4.PoolMain
packagecom.study.pool;public classPoolMain {/*** 數(shù)據(jù)源緩沖池 實(shí)例練習(xí)*/
public static voidmain(String[] args) {
System.out.println("緩沖池模擬開始");
PoolThread[] threads= new PoolThread[50];for(int i=0;i
threads[i]= newPoolThread();
}for(int i=0;i
threads[i].start();
}
}
}
最后附一個(gè)集成spring的properties配置:(也是我項(xiàng)目中用的配置)
db.properties
;;;;;;;;;;;;;;;;;;;;
;DataBaseConnection;
;;;;;;;;;;;;;;;;;;;;
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/exam5
jdbc.username=root
jdbc.password=123456
jdbc.initialPoolSize=10
jdbc.minPoolSize=5
jdbc.maxPoolSize=30
jdbc.maxIdleTime=200
jdbc.maxStatementsPerConnection=50
spring配置數(shù)據(jù)源
總結(jié)
以上是生活随笔為你收集整理的java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 烫伤可以用牙膏、酱油、食醋处理吗?
- 下一篇: java 7zip解压_Apache C