1. 程式人生 > >學習c3p0連線池的原理與使用總結

學習c3p0連線池的原理與使用總結

原理:為什麼要有c3p0?c3p0的作用是什麼?

  • 在使用JDBC操作資料庫時,我們一般有幾個基本的步驟(載入驅動、建立連線、建立語句、執行語句、關閉資源),其中建立連線是一個重要的步驟,每操作一次資料庫我們都需要獲取一個Connection,當資料庫操作不是很頻繁時,沒多大關係,可是一旦高併發的情況下,幾千個執行緒需要獲取連線的時候,那麼連線的建立將會是一個非常耗時和耗空間的操作,建立的初始化需要一定的時間,這在一定程度上會影響效能。

  • 基於此種情況,c3p0將在池中先建立一些連線Connection,等執行緒需要使用的時候直接拿就行,縮短了建立的時間,提高了響應速度。在使用完之後連線釋放之後放回池中,但並未真正的關閉資源,等待下一次任務獲取。

下面是c3p0的使用:

  1. 新建專案匯入jar包 在這裡插入圖片描述
  2. 配置檔案
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
    <default-config>
        <property name="initialPoolSize">10</property>
        <property name="maxIdleTime">30</property>
        <property name="maxPoolSize">100</property>
        <property name="minPoolSize">10</property>
        <property name="maxStatements">200</property>
    </default-config>
    
    <named-config name="mysql">
        <property name="driverClass">com.mysql.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/testtest</property><!-- jdbc為資料庫名 -->
        <!-- <property name="jdbcUrl">jdbc:mysql:///資料庫名</property> -->
        <property name="user">root</property>
        <property name="password">root</property>
     <!-- 初始化連線池中的連線數,取值應在minPoolSize與maxPoolSize之間,預設為3-->
        <property name="initialPoolSize">10</property>
        <!--最大空閒時間,60秒內未使用則連線被丟棄。若為0則永不丟棄。預設值: 0 -->  
        <property name="maxIdleTime">30</property>  
        <!--連線池中保留的最大連線數。預設值: 15 -->
        <property name="maxPoolSize">100</property> 
        <!-- 連線池中保留的最小連線數,預設為:3--> 
        <property name="minPoolSize">10</property>   
        <!--c3p0全域性的PreparedStatements快取的大小。如果maxStatements與maxStatementsPerConnection均為0,則快取不生效,只要有一個不為0,則語句的快取就能生效。如果預設值: 0--> 
        <property name="maxStatements">200</property>  
        <!-- 當連線池連線耗盡時,客戶端呼叫getConnection()後等待獲取新連線的時間,超時後將丟擲SQLException,如設為0則無限期等待。單位毫秒。預設: 0 -->   
        <!-- <property name="checkoutTimeout" value="3000"/>  -->
        <property name="checkoutTimeout">3000</property> 
        <!--當連線池中的連線耗盡的時候c3p0一次同時獲取的連線數。預設值: 3 -->   
        <!-- <property name="acquireIncrement" value="2"/> --> 
         <property name="acquireIncrement">2</property>
        <!--定義在從資料庫獲取新連線失敗後重復嘗試的次數。預設值: 30 ;小於等於0表示無限次-->   
        <!-- <property name="acquireRetryAttempts" value="0"/> -->  
        <property name="acquireRetryAttempts">0</property>
        <!--重新嘗試的時間間隔,預設為:1000毫秒-->   
        <!-- <property name="acquireRetryDelay" value="1000" />  -->
        <property name="acquireRetryDelay">1000</property>
        <!--關閉連線時,是否提交未提交的事務,預設為false,即關閉連線,回滾未提交的事務 -->   
        <property name="autoCommitOnClose">false</property>  
        <!--c3p0將建一張名為Test的空表,並使用其自帶的查詢語句進行測試。如果定義了這個引數那麼屬性preferredTestQuery將被忽略。你不能在這張Test表上進行任何操作,它將只供c3p0測試使用。預設值: null -->   
        <property name="automaticTestTable">Test</property> 
         <!--如果為false,則獲取連線失敗將會引起所有等待連線池來獲取連線的執行緒丟擲異常,但是資料來源仍有效保留,並在下次呼叫getConnection()的時候繼續嘗試獲取連線。如果設為true,那麼在嘗試獲取連線失敗後該資料來源將申明已斷開並永久關閉。預設: false-->   
        <property name="breakAfterAcquireFailure">false</property>
        <!--每60秒檢查所有連線池中的空閒連線。預設值: 0,不檢查 -->   
        <property name="idleConnectionTestPeriod">60</property>    
        <!--maxStatementsPerConnection定義了連線池內單個連線所擁有的最大快取statements數。預設值: 0 -->   
        <property name="maxStatementsPerConnection">0</property> 
        
    </named-config>  
      
      
    <!-- This is my config for oracle 
    <named-config name="oracle">  
        <property name="driverClass">oracle.jdbc.driver.OracleDriver</property>  
        <property name="jdbcUrl">jdbc:oracle:thin:@localhost:1521:orcl</property>  
        <property name="user">scott</property>  
        <property name="password">liang</property>  
        <property name="initialPoolSize">10</property>  
        <property name="maxIdleTime">30</property>  
        <property name="maxPoolSize">100</property>  
        <property name="minPoolSize">10</property>  
        <property name="maxStatements">200</property>  
    </named-config>  -->  
</c3p0-config>

注意:此種寫法錯誤<property name="acquireIncrement" value="2"/>會報Failed to coerce property: acquireIncrement [propVal: ; propType: int] java.lang.NumberFormatException: For input string: “” 異常

正確寫法: <property name="acquireIncrement">2</property>
  1. 獲取Connection連線類 在這裡插入圖片描述

  2. 測試類 在這裡插入圖片描述