2010-01-16 13 views
39

我從錯誤信息看這樣的建議:與MySql的連接正在自動中止。如何正確配置Connector/J?

你應該考慮要麼到期 和/或測試連接有效性 使用前在應用程序中, 增加服務器的客戶端超時配置 值,或使用 的連接器/ J連接屬性 'autoReconnect = true'可以避免此問題 。

我正在使用Spring和JPA。我應該在哪裏配置Connector/J? (?在persistence.xml,或entityManagerFactory spring配置,或​​Spring配置,或其他地方)

+0

請幫助https://stackoverflow.com/questions/47011116/the-last-packet-sent- - :testConnectionOnCheckout如果不是有更多可能的解決方案這個解決方案沒有工作=真

成功到服務器是-70-400-003-milliseconds-ag – Tony 2017-10-30 09:05:50

回答

54

文介紹了三種解決方案,以防止連接中止:

  1. 配置連接字符串autoReconnect=true。這是URL連接字符串的一個屬性,它在驅動程序級別工作。您需要更改數據源配置中的連接字符串。

    url="jdbc:mysql://localhost:3306/confluence?autoReconnect=true" 
    
  2. 增加超時。這通常是數據庫的一個屬性。您可以增加此值以查看是否獲得較少的連接中止。

  3. 配置連接池以測試連接驗證。這是在游泳池完成的,而不是駕駛員的水平。這將取決於您使用的數據源實施。但是,如果您使用的是合併的數據源,則應該可以在數據源的屬性中進行配置。 c3p0

其它附加評論:

  • 數據源/池也可以具有一個超時,其對應於時間的空閒連接剩餘ns在池中。不要與數據庫超時混淆。
  • 有幾種方法可以測試連接的有效性。一種常見的方法是製作虛擬測試表。該池將在虛擬測試表上發出一個選擇,以查看連接是否仍然正常。
+6

MySQL驅動程序沒有正確實現autoReconnect選項。第一個請求將失敗,並且驅動程序嘗試重新建立連接AFTERWARDS。 – Riking 2013-10-05 21:11:15

+1

因爲這個答案似乎是一個搜索引擎的青睞,它會如果它與一些額外的解釋來了,在WAIT_TIMEOUT的含義爲MySQL,以及應如何與C3P0的配置玩就好了。面對這個問題,我可以看到MySQL的wait_time是28800.如果這是8小時,那麼我不想把它設置爲72h。我甚至不明白如何才能接受連接會持續8個小時。 – Stephane 2014-10-17 09:36:10

+5

@StephaneEybert我發現這個問題的一個真正的好解釋一下:http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html。這可以幫助別人在未來 – sunil 2015-04-27 06:13:41

14

AutoReconnect不推薦使用。 From MySQL here

驅動程序是否應該嘗試重新建立陳舊和/或死亡的連接? 如果啓用,驅動程序將針對在 上發出的查詢發出異常,該請求屬於當前事務 ,但會在新事務中的 連接上發出的下一個查詢之前嘗試重新連接。建議使用此功能不是 ,因爲它具有與會話狀態相關的副作用和 數據一致性,因爲應用程序不能正確處理SQLExceptions ,並且僅在您無法使用時設計爲使用 將應用程序配置爲處理由於死亡 和陳舊連接導致的SQLExceptions。或者,作爲最後一個選項, 調查將MySQL服務器變量「wait_timeout」的值設置爲較高的值 ,而不是默認的8小時。

+4

那麼,推薦呢? – jackthehipster 2016-10-13 09:04:01

+0

使用c3po與選項testConnectionOnCheckout = true – 2017-09-15 14:33:27

+0

@AndersB我使用c3po,但錯誤仍然存​​在https://stackoverflow.com/questions/47011116/the-last-packet-sent-successfully-to-the-server-was-70 -400-003-milliseconds-ag – Tony 2017-10-30 09:02:00

-8

這是像我這樣的人通過搜索引擎找到這個舊帖子。

其他答案更好長期解決方案。但是,如果您只需要mysql連接立即再次運行,則可以shutdown,然後restarttomcat,一切都將正常工作一段時間。這使您可以避免系統停機,同時找出更長期的解決方案。

導航到$CATALINA_HOMEterminal,然後鍵入shutdown.sh,然後鍵入startup.sh。等待啓動順序完成一會兒,然後您的應用程序將再次運行一段時間。

+0

這個問題沒有提到有關使用Tomcat的任何內容。 – thechrisproject 2015-04-23 14:42:10

+0

@thechrisproject問題是關於春天。 Tomcat是用於託管彈簧應用程序的主要容器。這個答案中描述的方法解決了OP問題。 – CodeMed 2015-04-23 21:49:34

+0

爲什麼我們要針對某些長期不起作用的解決方案?所有數據庫服務器和連接都需要在設計時考慮到長遠眼光 – sunil 2015-04-27 06:15:29

0

我經歷了很多解決方案,我的問題已經解決,但一段時間後連接超時或斷開連接。2天后,我得到了解決方案,解決了我的問題。

許多解決方案建議使用autoReconnect = true但是當我通過文檔。我看到在描述autoReconnect的參數源以下文字:

使用此功能不推薦,因爲它有當我在Hibernate代碼看起來與會話狀態和數據一致性

副作用。 Hibernate的基本連接機制不支持重連,必須使用H3C0連接池(本身並不總是支持重連)。

但是一旦使用過H3C0,默認行爲似乎是處理請求,如果連接死了,那麼用戶會看到錯誤 - 但至少它會重新連接下一個請求。我想一個錯誤比無限錯誤更好,但仍然不如零錯誤。事實證明,需要optiontestConnectionOnCheckout-文檔不建議這麼做,因爲在請求之前測試連接可能導致性能下降。當然,軟件首先必須工作,其次才需要快速工作。

因此,要總結,要獲得一個連接的「工作」(我定義爲包括處理由沒有錯誤重新連接掉線):在「hibernate.cfg.xml中」:

<!-- hibernate.cfg.xml --> 
    <property name="c3p0.min_size">5</property> 
    <property name="c3p0.max_size">20</property> 
    <property name="c3p0.timeout">1800</property> 
    <property name="c3p0.max_statements">50</property> 
    <!-- no "connection.pool_size" entry! --> 

然後創建文件「c3p0.properties」,它必須是在類路徑的根(即,沒有辦法來覆蓋它的應用程序的特定部分):

c3p0.properties

C3P0。

1. Add 

<property name="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 

Also dont forget to place the c3p0-0.9.1.jar in the classpath. 



    2. Instead of using that c3p0.properties file, couldn't you just use this property in your hibernate.cfg.xml: 

<property name="hibernate.c3p0.validate">true</property> 

    Also checkout the last post on this page: 

    https://forum.hibernate.org/viewtopic.php?p=2399313 

    If all these not work than go [more][1] and read in detail 


    [1]: http://hibernatedb.blogspot.in/2009/05/automatic-reconnect-from-hibernate-to.html