我從生產代碼此錯誤:重現com.mysql.jdbc.exceptions.jdbc4.CommunicationsException與Spring的安裝,休眠和C3P0
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException : 的最後一個數據包成功地接收 從服務器was36940秒 年前故去成功發送 到服務器最後一個分組被36940秒前, ,其長於「WAIT_TIMEOUT」的服務器 配置的值。 你應該考慮要麼到期 和/或測試連接有效性 使用前在應用程序中, 增加服務器的客戶端超時配置 值,或使用 連接器/ J連接屬性 「autoReconnect的=真」,以避免這種 問題。
現在我試圖在本地重現問題並修復它。我設置Spring上下文如下:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
destroy-method="close" p:driverClass="com.mysql.jdbc.Driver"
p:jdbcUrl="jdbc:mysql://localhost:3306/test?userUnicode=yes&characterEncoding=UTF-8&"
p:idleConnectionTestPeriod="120" p:initialPoolSize="1" p:maxIdleTime="1800"
p:maxPoolSize="1" p:minPoolSize="1" p:checkoutTimeout="1000"
/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<value>
hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.default_schema=platform_server_original
hibernate.show_sql=false
</value>
</property>
<property name="mappingResources">
<list>
<value>sometables.hbm.xml</value>
</list>
</property>
</bean>
然後我把我的MySQL WAIT_TIMEOUT至10秒,然後運行我的測試,這基本上是打開一個連接,做一個查詢,關閉它,所以它返回到池,然後將線程休眠15秒,然後再次打開連接,然後再次執行查詢,以便它斷開。不過,我只得到了類似的錯誤:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: 通信鏈路故障
末向服務器發送數據包是16 毫秒前。
所以我想知道這兩個錯誤是一樣的,還是不一樣?我做了一些研究,似乎這兩個錯誤來到了相同的解決方案:使用屬性「testConnectionOnCheckout =真」。但是,根據c3p0 doc,這是一個非常昂貴的檢查。它建議使用「idleConnectionTestPeriod」的,但我已經設置,爲120秒。我應該使用什麼值才能正確驗證空閒連接?
所以我基本上是問兩兩件事:1。 我怎麼重現我在生產代碼中得到了錯誤? 2.我該如何解決?
謝謝!
你從生產最初的錯誤是在談論超過10小時的一段時間,當連接被檢查出系統首次當發生在早上使用?難道你不能只是將最小池大小設置爲0,或者通過JXB公開池並在工作日開始前將其清除? – SteveD 2009-10-05 19:32:51
@菲 - 你解決了嗎?有興趣知道結果是什麼。 – 2009-10-31 01:34:29
我最終使用了以下2個屬性: testConnectionOnCheckout =「true」 preferredTestQuery =「select 1」 不是最優化的解決方案,但它至少解決了問題。 – fei 2009-11-04 18:19:27