關於 No operations allowed after connection closed問題

ERROR - No operations allowed after connection closed.
2011-12-07 11:36:09 - ERROR - query failed
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)
at org.hibernate.loader.Loader.doList(Loader.java:2148)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2029)
at org.hibernate.loader.Loader.list(Loader.java:2024)
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:375)
at org.hibernate.hql.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:308)
at org.hibernate.engine.query.HQLQueryPlan.performList(HQLQueryPlan.java:153)
at org.hibernate.impl.SessionImpl.list(SessionImpl.java:1106)
at org.hibernate.impl.QueryImpl.list(QueryImpl.java:79)
分析,出現這種異常的原因是:
Mysql服務器默認的“wait_timeout”是8小時,也就是說一個connection空閒超過8個小時,Mysql將自動斷開該connection。這就是問題的所在,在C3P0 pools中的connections如果空閒超過8小時,mysql將其斷開,而C3P0並不知道該connection已經失效,如果這時有Client請求connection,C3P0將該失效的Connection提供給Client,將會造成上面的異常。
a)解決的方法有3種:
    增加wait_timeout的時間。
    減少Connection pools中connection的lifetime。
    測試Connection pools中connection的有效性。
b)具體解決方案:
   1、換一下JDBC驅動,JDBC3.1.0-alpha及以前版本會出現此問題,下載新的JDBC驅動
  2、使用hibernate配置:
使用hibernate: 
<property name="connection.autoReconnect">true</property>  <!--這個是最主要的--> 
<property name="connection.autoReconnectForPools">true</property> 
<property name="connection.is-connection-validation-required">true</property> 
加入以上property,可解決此問題,如果未使用hibernate等持久化管理框架,可在mysql的url中加入autoReconnect=true,這樣就可以解決。
原因很簡單。在對數據庫操作結束後關閉連接是正確的做法,沒什麼大問題。至於出現:No operations allowed after connection closed。這樣的問題原因只有一個,你這裏和數據庫的連接Connection是一個Static的,程序共享這一個Connection。所以第一次對數據庫操作沒問題,當把Connection關閉後,第二次還想操作數據庫時Connection肯定不存在了。
總結:
項目應用部署環境和數據庫不在同一個服務器,應用做了域名映射,訪問應應用會報No operations allowed after connection closed問題。
但局域網應用本機連接數據庫沒有該問題。
個人覺得可能是生產環境訪問數據庫較慢或網絡延時太大造成連接關閉的問題。
通過測試加入autoReconnect=true解決了現有生產問題。
但這樣會不會使數據庫開銷較大呢?
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章