3

Grails2.2/Hibernate/Tomcat7/MySQL5.5 Web サーバーがあります。Web クライアントから何時間もリクエストされなかった後、最初のリクエストは次のように失敗します。(実際、これは毎朝行われます。) シーケンシャルな要求はすべて正しく処理されます。

MySQLドライバーに指示しまし?autoReconnect=trueたが、役に立ちませんでした。

ロールバックは以下で確認できますが、コードから直接呼び出すことはしません。代わりに、長い一時停止の後にオブジェクトを永続化しようとすると、暗黙的に発生します。

それを治すためのアイデアはありますか?

Error 500: Executing action [actionName] of controller [MyController] caused exception: Runtime error executing action
Servlet: grails
URI: /appname/grails/appName/actionName.dispatch
Exception Message: Communications link failure during rollback(). Transaction resolution unknown. 
Caused by: Communications link failure during rollback(). Transaction resolution unknown. 
Class: MyController 
At Line: [139] 
Code Snippet:

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Communications link failure during rollback(). Transaction resolution unknown.
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.Util.getInstance(Util.java:386)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1014)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:988)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:974)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:919)
    at com.mysql.jdbc.ConnectionImpl.rollback(ConnectionImpl.java:4808)
    at org.apache.commons.dbcp.DelegatingConnection.rollback(DelegatingConnection.java:368)
    at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.rollback(PoolingDataSource.java:323)
    at MyController.logRequest(...)
    ...
    at grails.plugin.cache.web.filter.PageFragmentCachingFilter.doFilter(PageFragmentCachingFilter.java:195)
    at grails.plugin.cache.web.filter.AbstractFilter.doFilter(AbstractFilter.java:63)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
    at java.lang.Thread.run(Thread.java:636)

Tomcat の context.xml:

<Resource name="jdbc/JNDI_NAME" auth="Container"
 type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver"
 url="jdbc:mysql://localhost:3306/dbname?autoReconnect=true"
 username="xxx" password="xxx" maxActive="20" maxIdle="10"
 removeAbandoned="true" removeAbandonedTimeout="60" logAbandoned="true"
 maxWait="-1"/>
4

2 に答える 2

2

次の c3po 構成をhibernate.cfg.xmlファイルに追加してみてください。それは役立つはずです。これを参照してください。

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
<property name="hibernate.c3p0.acquire_increment">1</property>
<property name="hibernate.c3p0.idle_test_period">300</property>
<property name="hibernate.c3p0.timeout">5000</property>
<property name="hibernate.c3p0.max_size">10</property>
<property name="hibernate.c3p0.max_statements">0</property>
<property name="hibernate.c3p0.min_size">1</property>
<property name="hibernate.c3p0.acquireRetryAttempts">3</property>
<property name="hibernate.c3p0.acquireRetryDelay">1000</property>
于 2013-01-31T12:34:30.200 に答える
0

c3p0 は私のアプリケーションでは使用されていないため、最初にデータベース接続を検証するようにデータ ソースに指示することになります。

<Resource ...
   validationQuery="SELECT 1"
   testOnBorrow="true"/>
于 2013-02-13T08:02:25.093 に答える