c 3 pOデータソース構成





3

30

1000

false

Test

false

100



null

false

60

3

60

15

100



3

root

password



select id from test where id=1

300

false

true

root
<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です.開発テストに問題はありません.実行中に長い空き時間ごとに異常が発生します.
JAvaコード
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_timeout」は8時間です.つまり、1つのconnectionが8時間以上空いていると、Mysqlは自動的に接続を切断します.これが問題で、C 3 P 0 poolsのconnectionsが8時間以上空いている場合、Mysqlはそれを切断しますが、C 3 P 0はそのconnectionが失効したことを知らないので、Clientがconnectionを要求している場合、C 3 P 0はその失効したConnectionをClientに提供し、上面の異常をもたらします.
解決策は3つあります.
wait_を追加timeoutの時間.
Connection poolsのconnectionのlifetimeを減らします.
接続poolsでの接続の有効性をテストします.
もちろん最善の方法は上記3つの方法を併用することであり、以下DBPPとC 3 P 0をそれぞれ説明し、wait_timeoutはデフォルトの8時間です
DBCPでは、以下の構成情報を追加します.
//set to 'SELECT 1'
validationQuery = "SELECT 1"
//set to 'true'
testWhileIdle = "true"
//some positive integer
timeBetweenEvictionRunsMillis = 3600000
//set to something smaller than 'wait_timeout'
minEvictableIdleTimeMillis = 18000000
//if you don't mind a hit for every getConnection(), set to "true"
testOnBorrow = "true"
C 3 P 0は、以下の構成情報を追加する.
//connnction取得時にテストが有効かどうか
testConnectionOnCheckin = true
//自動テストのtable名
automaticTestTable=C3P0TestTable
//set to something much less than wait_timeout, prevents connections from going stale
idleConnectionTestPeriod = 18000
//set to something slightly less than wait_timeout, preventing 'stale' connections from being handed out
maxIdleTime = 25000
//if you can take the performance 'hit', set to "true"
testConnectionOnCheckout = true
詳細については、C 3 P 0ドキュメント、Connector/Jドキュメント、DBPPドキュメントを参照してください.
回転:http://www.iteye.com/article/38506
構成:
jdbc.driverClass=com.mysql.jdbc.Driver
jdbc.jdbcUrl = jdbc:mysql://localhost:3306/test
jdbc.user = root
jdbc.password = 12345
jdbc.miniPoolSize = 1
jdbc.maxPoolSize = 20
jdbc.initialPoolSize = 1
jdbc.maxIdleTime = 25000
jdbc.acquireIncrement = 1

jdbc.acquireRetryAttempts = 30
jdbc.acquireRetryDelay = 1000
jdbc.testConnectionOnCheckin = true
jdbc.automaticTestTable = c3p0TestTable
jdbc.idleConnectionTestPeriod = 18000
jdbc.checkoutTimeout=3000

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
   <property name="driverClass" value="${jdbc.driverClass}" />
   <property name="jdbcUrl" value="${jdbc.jdbcUrl}" />
   <property name="user" value="${jdbc.user}" />
   <property name="password" value="${jdbc.password}" />
   <property name="minPoolSize" value="${jdbc.miniPoolSize}" />
   <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>  
   <property name="initialPoolSize" value="${jdbc.initialPoolSize}"/>
   <property name="maxIdleTime" value="${jdbc.maxIdleTime}"/>
   <property name="acquireIncrement" value="${jdbc.acquireIncrement}"/>
  
   <property name="acquireRetryAttempts" value="${jdbc.acquireRetryAttempts}"/>
   <property name="acquireRetryDelay" value="${jdbc.acquireRetryDelay}"/>
   <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}"/>
   <property name="automaticTestTable" value="${jdbc.automaticTestTable}"/>
   <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
   <property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/>

</bean>