C3p0-數據庫連接池

數據庫鏈接池

數據庫連接池的概念

數據庫連數據庫接池負責分配、管理和釋放數據庫連接,它允許應用程序重複使用一個現有的數據庫連接,而再不是重新建立一個。

數據庫鏈接池的原理

連接池基本的思想是在系統初始化的時候,將數據庫連接作爲對象存儲在內存中,當用戶需要訪問數據庫時, 並非建立一個新的連接,而是從連接池中取出一個已建立的空閒連接對象。使用完畢後,用戶也並非將連接關閉,而是將連接放回連接池中,以供下一個請求訪問使 用。而連接的建立、斷開都由連接池自身來管理。同時,還可以通過設置連接池的參數來控制連接池中的初始連接數、連接的上下限數以及每個連接的最大使用次 數、最大空閒時間等等。也可以通過其自身的管理機制來監視數據庫連接的數量、使用情況等。

 

 

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章