我討厭說明似乎在網上有很多解決方案的問題,但我們似乎無法爲我們的案例找到任何有效的最佳實踐解決方案,因此我們覺得我們別無選擇。如何在使用Guice Injections時正確處理Java中的長期MySQL連接?
我們正在構建一個RESTful服務器應用程序,其中使用時間段可能會從幾個小時到幾個月不等。
服務器由Jetty託管。我們沒有使用任何ORM,但應用程序分爲三層(WebService-,Business-和Data Layer)。數據層存在一類通過Guice框架注入。 JDBC(MySQL連接)在此類的構造函數中實例化。起初,我們在連接太多之前遇到了很多問題,然後才明白Guice默認會在每個請求中創建一個新實例(ref)。爲了擺脫這個問題,並且因爲我們的數據層類是有狀態的,我們將這個類作爲Singleton注入。
現在我們已經預見到,當我們的REST應用程序未使用一段時間時,我們可能會遇到麻煩,因爲連接將超時,並且沒有新的連接將被實例化,因爲構造函數只會被調用一次。
我們現在有多種解決方案,但我們似乎無法找出解決這個問題的最佳方法,因爲它們中的任何一個看起來都不那麼好。任何意見或建議,以其他解決方案將不勝感激。
1.擴展配置的MySQL超時間隔 我們真的不希望這樣,因爲我們認爲這確實不是最好的做法。我們當然不應該有任何泄漏的連接對象,但是如果我們有,它們將填補可用連接的空閒空間。
2.實例化在每個方法的開始一個新的連接,並在年底 關閉它是這樣的,據我們瞭解,不是最好的做法,在所有的,因爲它會造成很大的開銷,如果可能的話應該避免?
3.更改注射回「每個請求」,並關閉池中的每個方法 結束這將是更糟比#2,因爲我們不僅實例化一個新的連接,但還要在每個請求上實例化一個新對象?
4.檢查在每個方法的開始連接的狀態,如果它的封閉 實例化一個新的連接的一個例子是ping通(example)的MySQL和實例化一個新的連接,如果它拋出例外。這會起作用,但會產生一些開銷。任何關於這個輸入是否會對性能產生影響的想法?
5.明確捕獲任何異常被拋出的,表明連接中斷的方法,如果是這樣 - 實例化一個新的連接 這樣一來,我們就擺脫平的開銷,但它會變得複雜了代碼顯着,因爲我們必須找出一種方法來確保這些方法將返回它們在已經存在的連接時將返回的內容。
6.使用連接池 除了使用應用程序服務器(即Glassfish)時,我們並不熟悉連接池。我們也想知道這是否能夠解決我們的問題?如果是這樣;任何提供給我們連接池的框架的建議? Here他們建議使用PLUS和Jetty。
請問有什麼不清楚的地方。我可能忘記添加一些重要信息。這對我來說更像是一個設計問題,但如果有人認爲會提供幫助,我很樂意提供任何代碼。
在此先感謝!
謝謝,bmorris591!我猜連接池是不可避免的 - 這可能不是負面的。必須是他們如此廣泛的原因:) – Skovly 2013-02-18 08:47:11