篇の良い文を回転します:c 3 p 0詳しい配置と1つの問題


c 3 p 0詳細構成
公式文書:
http://www.mchange.com/projects/c3p0/index.html

<c3p0-config>
<default-config>
<!--             c3p0          。Default: 3 -->
<property name="acquireIncrement">3</property>

<!--                      。Default: 30 -->
<property name="acquireRetryAttempts">30</property>

<!--         ,    。Default: 1000 -->
<property name="acquireRetryDelay">1000</property>

<!--                  。Default: false -->
<property name="autoCommitOnClose">false</property>

<!--c3p0      Test   ,               。           
  preferredTestQuery    。      Test        ,    c3p0  
  。Default: null-->
<property name="automaticTestTable">Test</property>

<!--                             。        
  ,      getConnection()           。    true,     
                      。Default: false-->
<property name="breakAfterAcquireFailure">false</property>

<!--            getConnection()           ,      
SQLException,   0      。    。Default: 0 -->
<property name="checkoutTimeout">100</property>

<!--    ConnectionTester QueryConnectionTester       。        。
Default: com.mchange.v2.c3p0.impl.DefaultConnectionTester-->
<property name="connectionTesterClassName"></property>

<!--  c3p0 libraries   ,  (      )             ,  null  
Default: null-->
<property name="factoryClassLocation">null</property>

<!--Strongly disrecommended. Setting this to true may lead to subtle and bizarre bugs.
(    )              -->
<property name="forceIgnoreUnresolvedTransactions">false</property>

<!-- 60              。Default: 0 -->
<property name="idleConnectionTestPeriod">60</property>

<!--          ,    minPoolSize maxPoolSize  。Default: 3 -->
<property name="initialPoolSize">3</property>

<!--      ,60           。  0     。Default: 0 -->
<property name="maxIdleTime">60</property>

<!--            。Default: 15 -->
<property name="maxPoolSize">15</property>

<!--JDBC     ,           PreparedStatements  。       statements
    connection        。                   。
  maxStatements maxStatementsPerConnection  0,      。Default: 0-->
<property name="maxStatements">100</property>

<!--maxStatementsPerConnection                   statements 。Default: 0 -->
<property name="maxStatementsPerConnection"></property>

<!--c3p0      ,   JDBC          。               
                。Default: 3-->
<property name="numHelperThreads">3</property>

<!--     getConnection()  root            。          c3p0
     。Default: null-->
<property name="overrideDefaultUser">root</property>

<!-- overrideDefaultUser           。Default: null-->
<property name="overrideDefaultPassword">password</property>

<!--  。Default: null-->
<property name="password"></property>

<!--                。                      。  :
                  。Default: null-->
<property name="preferredTestQuery">select id from test where id=1</property>

<!--                 300 。Default: 300 -->
<property name="propertyCycle">300</property>

<!--                 。    true     connection   
          。    idleConnectionTestPeriod automaticTestTable
             。Default: false -->
<property name="testConnectionOnCheckout">false</property>

<!--    true                   。Default: false -->
<property name="testConnectionOnCheckin">true</property>

<!--   。Default: null-->
<property name="user">root</property>

<!--   c3p0   JDBC          。                 
                      。                
      ,          。                     
  ,                   。Default: false-->
<property name="usesTraditionalReflectiveProxies">false</property>

<property name="automaticTestTable">con_test</property>
<property name="checkoutTimeout">30000</property>
<property name="idleConnectionTestPeriod">30</property>
<property name="initialPoolSize">10</property>
<property name="maxIdleTime">30</property>
<property name="maxPoolSize">25</property>
<property name="minPoolSize">10</property>
<property name="maxStatements">0</property>
<user-overrides user="swaldman">
</user-overrides>
</default-config>
<named-config name="dumbTestConfig">
<property name="maxStatements">200</property>
<user-overrides user="poop">
<property name="maxStatements">300</property>
</user-overrides>
</named-config>
</c3p0-config>
回転:
http://www.wujianrong.com/archives/2007/08/c3p0.html
MYSQL 8時間の問題を解決します。
一番近い項目はHibernateでC 3 P 0の接続池を使っています。データベースはMysqlです。開発テストは問題ありません。運転中は長い間の空き時間に異常が発生します。

org.hibernate.exception.JDBCConnectionException: could not execute query 
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:74) 
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43) 
....... 
Caused by: com.mysql.jdbc.exceptions.MySQLNonTransientConnectionException: No operations allowed after connection closed.Connection was implicitly closed due to underlying exception/error: 
** BEGIN NESTED EXCEPTION ** 
com.mysql.jdbc.CommunicationsException 
MESSAGE: Communications link failure due to underlying exception: 
** BEGIN NESTED EXCEPTION ** 
java.net.SocketException 
MESSAGE: Broken pipe 
STACKTRACE: 
java.net.SocketException: Broken pipe 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
...... 
** END NESTED EXCEPTION ** 
Mysqlの文書とConnector/Jの文書とオンライン説明を見たら、この異常な原因は:
Mysqlサーバのデフォルトの「wait uutimeout」は8時間、つまりconnectionの空き時間が8時間を超えると、Mysqlは自動的にこのコンサートを切断します。これは問題の所在です。C 3 P 0 poolsでのconnectionsの空き時間が8時間を超えると、Mysqlが切断されます。C 3 P 0はこのconnectionが失効したことを知らないです。もしCientがconnectionを要求したら、C 3 P 0はこの失効したConnectionをCientに提供し、上面の異常を引き起こします。
解決の方法は3つあります。
1.wait_を増やすタイムアウトの時間
2.Connection poolsでのconnectionのlifetimeを減らす。
3.Connection poolsにおけるconnectionの有効性をテストします。
もちろん、上記3つの方法を併用しながら、DBCPとC 3 P 0についてそれぞれ説明します。timeoutはデフォルトの8時間です。
DBCPには以下の設定情報が追加されます。
//set to'SELECT 1'
validationQuery=「SELECT 1」
//set to'true'
testWhileIdle=「true」
//some positive integer
timeBetweenEviicationRuns Millis=3600000000
//set to something smaler than'wait_timeout
minevictable IdleTimeMillis=18000000000
//if you don't mind a hit for every get Connection()、set to「true」
test OnBorrow=「true」
C 3 P 0は、以下の構成情報を追加します。
//connnectionを取得する時、有効かどうかをテストします。
testConnection OnCheckin=true
//自動試験のテーブル名
atomatic TestTable=C 3 P 0 TestTable
//set to something much less than wait_timeout,prevents connections from going stale
idleConnection TestPeriod=18000
//set to something sless than wait_timeout,preventing'stale'connections from being handout
maxIdleTime=25000
//if you can take the performance'hit'set to"true"
testConnection OnCheckout=true
より多くの設定情報は、C 3 P 0ドキュメント、Connector/Jドキュメント、DBCPのドキュメントを見ることができます。
回転:
http://www.iteye.com/article/38506
自分の設定:
jdbc.driverClass=comp.mysql.jdbc.Driver
jdbc.jdbcUrl=jdbc:mysql://localhost:3306/test
jdbc.user=root
jdbc.password=12345
jdbc.miniPoolSize=1
jdbc.maxPoolSize=20
jdbc.initial PoolSize=1
jdbc.maxIdle Time=25000
jdbc.acquire Increment=1
jdbc.acquire RetryAttempts=30
jdbc.acquireRetryDelay=1000
jdbc.testConnection OnCheckin=true
jdbc.atomatic TestTable=c 3 p 0 TestTable
jdbc.idleConnection TestPeriod=18000
jdbc.checkout Timeout=3000
<bean id=「dataSource」class=「comp.mchange.v 2.c 3 p 0.compbolodData Source」destroy-method=「close」