天天看點

c3p0資料庫連接配接池

C3P0: 一個開源的JDBC連接配接池,它實作了資料源和JNDI綁定,支援JDBC3規範和JDBC2的标準擴充。目前使用它的開源項目有Hibernate,Spring等。

預設情況下(即沒有配置連接配接池的情況下),Hibernate會采用内建的連接配接池。但這個連接配接池性能不佳,是以官方也隻是建議僅在開發環境下使用。Hibernate支援第三方的連接配接池,官方推薦的連接配接池是C3P0,Proxool。

這裡說一下為什麼一定要使用C3P0吧:

1)hibernate官網推薦

2)  解決資料庫重新開機後tomcat在不需要重新開機的情況下即可重新獲得資料連接配接的問題。

這裡說一下如何配置,網上其實有好多,我隻是根據項目需要整理了一下,一共3種,大家根據需要來配置。

一。JNDI(項目比較常用,最簡單,與代碼無關聯)

1)在tomcat或者項目中引入最新版的C3P0的JAR包(我是用的是c3p0-0.9.2.1.jar)

如果啟動時報類沒有找到:Caused by: java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector,

則需要加入mchange-commons-java-0.2.3.4.jar。

2)修改tomcat中的資料源配置,如下:

c3p0資料庫連接配接池

<Resource name="jdbc/dbsource"     

            type="com.mchange.v2.c3p0.ComboPooledDataSource"    

            maxPoolSize="50" minPoolSize="5" acquireIncrement="2"  initialPoolSize="10"  maxIdleTime="60"  

            factory="org.apache.naming.factory.BeanFactory"    

            user="xxxx" password="xxxx"    

            driverClass="oracle.jdbc.driver.OracleDriver"    

            jdbcUrl="jdbc:oracle:thin:@192.168.x.x:1521:orcl"   

            idleConnectionTestPeriod="10" />   

參數說明:

(1)idleConnectionTestPeriod

當資料庫重新開機後或者由于某種原因程序被殺掉後,C3P0不會自動重新初始化資料庫連接配接池,當新的請求需要通路資料庫的時候,此時會報錯誤(因為連接配接失效),同時重新整理資料庫連接配接池,丢棄掉已經失效的連接配接,當第二個請求到來時恢複正常。

C3P0目前沒有提供當擷取已建立連接配接失敗後重試次數的參數,隻有擷取新連接配接失敗後重試次數的參數(acquireRetryAttempts【預設為30】 )。

要解決此問題,可以通過設定idleConnectionTestPeriod【預設為0,表示不檢查 】參數折中解決,該參數的作用是設定系統自動檢查連接配接池中連接配接是否正常的一個頻率參數,時間機關是秒 。

(2)acquireIncrement

當連接配接池中的的連接配接耗盡的時候c3p0一次同時擷取的連接配接數,也就是說,如果使用的連接配接數已經達到了maxPoolSize,c3p0會立即建立新的連接配接。

(3)maxIdleTime

另外,C3P0預設不會close掉不用的連接配接池,而是将其回收到可用連接配接池中,這樣會導緻,連接配接數越來越大,是以需要設定maxIdleTime【預設0,表示永遠不過期】,機關是秒,maxIdleTime表示idle狀态的connection能存活的最大時間。

3)項目中正常引入這個資料源即可,代碼不需要任何修改

二。Hibernate(spring+hibernate):不推薦,完全可以使用第一種和第三種方法代替。

1)項目中引入C3P0的JAR

2)修改Hibernate中的配置(我使用的是Spring+Hibernate),如下:

c3p0資料庫連接配接池

<bean id="sessionFactory"  

        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  

        <property name="dataSource" ref="dataSource"/>  

        <property name="mappingLocations" value="${hibernate.mapping.locations}" />  

        <property name="hibernateProperties">  

            <props>  

                <prop key="hibernate.dialect">  

                    ${hibernate.dialect}  

                </prop>  

                <prop key="hibernate.show_sql">  

                    ${hibernate.show_sql}  

                <prop key="hibernate.use_sql_comments">  

                    ${hibernate.use_sql_comments}  

                <prop key="hibernate.connection.provider_class">  

                    org.hibernate.connection.C3P0ConnectionProvider  

                <!--連接配接池的最小連接配接數 -->  

                <prop key="hibernate.c3p0.min_size">  

                    5  

                <!--最大連接配接數 -->  

                <prop key="hibernate.c3p0.max_size">  

                    50  

                <!--連接配接逾時時間 -->  

                <prop key="hibernate.c3p0.timeout">  

                    120  

                <!--statemnets緩存大小 -->  

                <prop key="hibernate.c3p0.max_statements">  

                    100  

                <!--每隔多少秒檢測連接配接是否可正常使用 -->  

                <prop key="hibernate.c3p0.idle_test_period">  

                <!--當池中的連接配接耗盡的時候,一次性增加的連接配接數量,預設為3 -->  

                <prop key="hibernate.c3p0.acquire_increment">  

                    2  

                <!-- 每次都驗證連接配接是否可用 -->   

                <prop key="hibernate.c3p0.validate">  

                    true  

            </props>  

        </property>  

    </bean>  

 3)這裡的dataSource可以是jndi。

三。dataSource(spring,開發常用)

如果使用spring,同時項目中不使用jndi,又不想配置到Hibernate中,可以直接将C3P0配置到dataSource中即可,如下:

c3p0資料庫連接配接池

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  

  <property name="driverClass"><value>oracle.jdbc.driver.OracleDriver</value></property>  

  <property name="jdbcUrl"><value>jdbc:oracle:thin:@localhost:1521:Test</value></property>  

  <property name="user"><value>Kay</value></property>  

  <property name="password"><value>root</value></property>  

  <!--連接配接池中保留的最小連接配接數。-->  

  <property name="minPoolSize" value="10" />  

  <!--連接配接池中保留的最大連接配接數。Default: 15 -->  

  <property name="maxPoolSize" value="100" />  

  <!--最大空閑時間,1800秒内未使用則連接配接被丢棄。若為0則永不丢棄。Default: 0 -->  

  <property name="maxIdleTime" value="1800" />  

  <!--當連接配接池中的連接配接耗盡的時候c3p0一次同時擷取的連接配接數。Default: 3 -->  

  <property name="acquireIncrement" value="3" />  

  <property name="maxStatements" value="1000" />  

  <property name="initialPoolSize" value="10" />  

  <!--每60秒檢查所有連接配接池中的空閑連接配接。Default: 0 -->  

  <property name="idleConnectionTestPeriod" value="60" />  

  <!--定義在從資料庫擷取新連接配接失敗後重複嘗試的次數。Default: 30 -->  

  <property name="acquireRetryAttempts" value="30" />  

  <property name="breakAfterAcquireFailure" value="true" />  

  <property name="testConnectionOnCheckout" value="false" />  

  </bean>  

參考資料:

若轉載請注明出處!若有疑問,請回複交流!