2011-07-10 33 views
1

我在Tomcat下有一個Java應用程序,連接到Postgre和MySQL數據庫。 每次我首次從Java訪問數據庫(過了一段時間),它總是失敗。我查看了Tomcat的日誌,發現這個:第一次訪問JDBC異常

成功發送到服務器的最後一個數據包是85313128毫秒前。是
長於服務器配置的值'wait_timeout'。在應用程序中使用之前,應考慮使用 到期和/或測試連接有效性,增加 服務器爲客戶端超時配置的值,或者使用連接器/ J連接 屬性'autoReconnect = true'來避免此問題。

我已經檢查this question 但並不真正瞭解的溶液(或它是否適用於我的情況),或者爲什麼發生這種情況。

我想問題是Postgre/MySQL數據庫空閒時間太長,但是當我用Java訪問數據庫時,我打開一個連接並在完成時關閉它,所以我不明白爲什麼連接應該保留打開這麼久。

任何人有任何想法?

更新:我沒有使用C3PO

...我連接:

Datasource d = context.lookup("...."); 
Connection c = d.getConnection(); 

並與斷開:

c.close(); 

而MySQL的背景是這樣的:

<Resource auth="Container" driverClassName="com.mysql.jdbc.Driver" maxActive="200" maxIdle="15" maxWait="-1" name="jdbc/project" password="...." type="javax.sql.DataSource" url="jdbc:mysql://localhost:3306/project" username="..."/> 
<ResourceLink global="jdbc/project" name="jdbc/project" type="javax.sql.DataSource"/> 
+0

你如何連接?你自己管理連接還是你有連接池處理它?如果是後者,如果你自己掌握連接管理會發生什麼? – cdegroot

+0

您是否調查過錯誤消息中的autoReconnect = true提示?你使用任何像C3P0的SQL池嗎? –

+0

@cdegroot @ZeroPage看到我的更新,請 –

回答

2

我猜你正在使用連接池來連接到MySQL。連接池的原理是它會打開一堆連接,並在您請求時爲您提供其中一個連接。關閉連接時,物理連接未關閉,但連接返回到池以供其他請求使用。這可以提供更好的性能,因爲您可以避免無限打開和關閉連接:打開連接的代價很高。

問題是,一個連接停留在池中而沒有被使用太多時間,MySQL認爲讓它再次打開並關閉它是沒有用的。 爲了避免這種情況,你可以

  • 配置連接池,它給你
  • 之前測試連接或增加MySQL服務器上WAIT_TIMEOUT作爲錯誤信息
  • 指示或使用連接屬性autoReconnect = true,如錯誤消息中所示。
+0

謝謝。增加wait_timeout不是一種選擇 - 我不知道事先有多久。我讀過,autoReconnect使用是由MySQL不鼓勵。所以我想最好的選擇是在使用它之前測試連接。你知道我該怎麼做嗎?在context.xml中? –

+0

請參閱http://www.mchange.com/projects/c3p0/index.html#configuring_connection_testing –

+0

mmmmm ...但我不認爲我使用C3P0,有沒有其他方法? –