2013-06-02 147 views
2

似乎是我的應用程序的問題。當應用程序長時間閒置(不確定確切的時間)後,我會在我的日誌中看到以下錯誤消息。我正在使用Spring + Hibernate + MySQL和ApacheDBCP進行連接池MySQL使用休眠和Apache DBCP連接池問題

ERROR [org.hibernate.util.JDBCExceptionReporter]The last packet successfully received from the server was 74,188,684 milliseconds ago. 
The last packet sent successfully to the server was 74,188,685 milliseconds ago. is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 
org.hibernate.exception.JDBCConnectionException: could not execute query 

如果我重新啓動URL,一切正常。我認爲這與我的連接池有關。這裏是我的Apache DBCP設置,並且MYSQL中的wait_timeout被設置爲默認值。 (28800秒或8小時)。

<beans:bean id="MyID" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> 
     <beans:property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
     <beans:property name="url" value="jdbc:mysql://localhost:17761/myDB"/> 
     <beans:property name="username" value="myname"/> 
     <beans:property name="password" value="mypwd"/> 
     <beans:property name="maxIdle" value="5"/> 
     <beans:property name="maxActive" value="20"/> 
     <beans:property name="minIdle" value="5"/> 
</beans:bean> 

雖然,我在尋找,我發現這個link解決問題的可行方案。

  1. 配置連接字符串autoReconnect的=真

    這能否幫助解決這個問題?在上面提到的同一個問題中,另一位作者說,這個解決方案並不可取。

  2. 增加MySQL服務器變量wait_timeout的值。

    我不知道這將如何幫助解決這個錯誤。如果有幫助,如何計算適當的wait_timeout值。我的意思是應該是什麼標準呢?

  3. 配置連接池以測試連接的有效性。

    經過一番研究後,我開始知道可以使用validationQuery =「SELECT 1」在執行實際查詢之前檢查連通性,這有助於解決問題嗎?不會影響性能嗎?

問題不只是特定於Apache DBCP,我也看到它在C3P0中。

請幫忙。

回答

1

看起來像我找到了解決方案。 我所做的只是在我的servlet-context.xml中添加下面的行。仍然檢查此線路的性能影響

<beans:property name="validationQuery" value="SELECT 1"/> 

問題仍然存在,爲什麼我實際上得到錯誤? :)

+0

也許你可以鏈接到你的其他問題,爲什麼你會得到錯誤。至於驗證查詢是否會影響性能:理論上它使用連接來執行某些操作。在實踐中,某些東西如此微不足道,並且很少運行以至於它在整個系統中的影響可以忽略不計。 – Jay