數據庫鏈接池
數據庫連接池的概念
數據庫連數據庫接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而再不是重新建立一個。
數據庫鏈接池的原理
連接池基本的思想是在系統初始化的時候,將數據庫連接作爲對象存儲在內存中,當用戶需要訪問數據庫時, 並非建立一個新的連接,而是從連接池中取出一個已建立的空閒連接對象。使用完畢後,用戶也並非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使 用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次 數、最大空閒時間等等。也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。
Java中的數據庫連接池-C3p0
C3p0的使用
用到的jar
c3p0下載地址:
http://sourceforge.net/projects/c3p0/
程序:
package c3p0.test;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.mchange.v2.c3p0.PooledDataSource;
public class C3p0Test {
public static void main(String[] args) {
ComboPooledDataSource pool = new ComboPooledDataSource();
try {
//設置數據庫驅動
pool.setDriverClass( "com.mysql.jdbc.Driver" );
} catch (PropertyVetoException e) {
e.printStackTrace();
}
//設置數據庫鏈接
pool.setJdbcUrl( "jdbc:mysql://127.0.0.1:3306/inss_print" );
//設置用戶名
pool.setUser("root");
//設置密碼
pool.setPassword("root");
//當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出
//SQLException,如設爲0則無限期等待。單位毫秒。Default: 0
pool.setCheckoutTimeout(20000);
//當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3
pool.setAcquireIncrement(3);
//連接池中保留的最小連接數
pool.setMinPoolSize(3);
//連接池中保留的最大連接數
pool.setMaxPoolSize(20);
//初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3
pool.setInitialPoolSize(3);
//最大空閒時間,60秒內未使用則連接被丟棄。若爲0則永不丟棄。Default: 0
pool.setMaxIdleTime(60);
/**因性能消耗大請只在需要的時候使用它。如果設爲true那麼在每個connection提交的
時候都將校驗其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
等方法來提升連接測試的性能。Default: false
*/
pool.setTestConnectionOnCheckout(false);
try {
Connection connection = pool.getConnection();
showConnPoolInfo(pool);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("select * from userinfo");
while(resultSet.next()){
System.out.println(resultSet.getString("username"));
}
resultSet.close();
statement.close();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}finally
{
showConnPoolInfo(pool);
}
}
/**
* 顯示連接池狀態
*/
private static void showConnPoolInfo(ComboPooledDataSource pool){
PooledDataSource pds = (PooledDataSource) pool;
if(null != pds){
try {
System.out.println("------------c3p0連接池鏈接狀態--------------");
System.out.println("c3p0連接池中 【 總共 】 連接數量:"+pds.getNumConnectionsDefaultUser());
System.out.println("c3p0連接池中 【 忙 】 連接數量:"+pds.getNumBusyConnectionsDefaultUser());
System.out.println("c3p0連接池中 【 空閒 】 連接數量:"+pds.getNumIdleConnectionsDefaultUser());
System.out.println("c3p0連接池中 【未關閉】 連接數量:"+pds.getNumUnclosedOrphanedConnectionsAllUsers());
} catch (SQLException e) {
System.out.println("c3p0連接池異常!");
}
}
}
}
屬性介紹
屬性 |
說明 |
acquireIncrement |
當連接池中的連接用完時,C3P0一次性創建新連接的數目 |
acquireRetryAttempts |
定義在從數據庫獲取新連接失敗後重復嘗試獲取的次數,默認爲30 |
acquireRetryDelay |
兩次連接中間隔時間,單位毫秒,默認爲1000 |
autoCommitOnClose |
連接關閉時默認將所有未提交的操作回滾。默認爲false |
automaticTestTable |
C3P0 將建一張名爲Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個參數,那麼屬性preferredTestQuery將被忽略。你 不能在 這張Test表上進行任何操作,它將中爲C3P0測試所用,默認爲null |
breakAfterAcquireFailure |
獲取 連接失敗將會引起所有等待獲取連接的線程拋出異常。但是數據源仍有效保留,並在下次調用getConnection()的時候繼續嘗試獲取連接。如 果設爲true,那麼在嘗試獲取連接失敗後該數據源將申明已斷開並永久關閉。默認爲 false |
checkoutTimeout |
當連接池用完時客戶端調用getConnection()後等待獲取新連接的時間,超時後將拋出SQLException,如設爲0則無限期等待。單位毫秒,默認爲0 |
connectionTesterClassName |
通 過實現ConnectionTester或QueryConnectionTester的類來測試連接,類名需設置爲全限定名。默認 爲 com.mchange.v2.C3P0.impl.DefaultConnectionTester |
idleConnectionTestPeriod |
隔多少秒檢查所有連接池中的空閒連接,默認爲0表示不檢查 |
initialPoolSize |
初始化時創建的連接數,應在minPoolSize與maxPoolSize之間取值。默認爲3 |
maxIdleTime |
最大空閒時間,超過空閒時間的連接將被丟棄。爲0或負數則永不丟棄。默認爲0 |
maxPoolSize |
連接池中保留的最大連接數。默認爲15 |
maxStatements |
JDBC 的標準參數,用以控制數據源內加載的PreparedStatement數量。但由於預緩存的Statement屬 於單個Connection而不是整 個連接池。所以設置這個參數需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均爲0, 則緩存被關閉。默認爲0 |
maxStatementsPerConnection |
連接池內單個連接所擁有的最大緩存Statement數。默認爲0 |
numHelperThreads |
C3P0是異步操作的,緩慢的JDBC操作通過幫助進程完成。擴展這些操作可以有效的提升性能,通過多線程實現多個操作同時被執行。默認爲3 |
preferredTestQuery |
定義所有連接測試都執行的測試語句。在使用連接測試的情況下這個參數能顯著提高測試速度。測試的表必須在初始數據源的時候就存在。默認爲null |
propertyCycle |
用戶修改系統配置參數執行前最多等待的秒數。默認爲300 |
testConnectionOnCheckout |
因性能消耗大請只在需要的時候使用它。如果設爲true那麼在每個connection提交的時候都 將校驗其有效性。建議使用 idleConnectionTestPeriod或automaticTestTable等方法來提升連接測試的性能。默認爲false |
testConnectionOnCheckin |
如果設爲true那麼在取得連接的同時將校驗連接的有效性。默認爲false |