2013-02-17 24 views
0

我討厭說明似乎在網上有很多解決方案的問題,但我們似乎無法爲我們的案例找到任何有效的最佳實踐解決方案,因此我們覺得我們別無選擇。如何在使用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。

請問有什麼不清楚的地方。我可能忘記添加一些重要信息。這對我來說更像是一個設計問題,但如果有人認爲會提供幫助,我很樂意提供任何代碼。

在此先感謝!

回答

2

連接池是要走的路。
他們有許多優點:

  1. 他們檢查你的連接,爲你 - 這與超時涉及
  2. 他們控制
  3. 你可以簡單地關閉連接,當你完成連接數 - 你不不需要保留參考文獻

你當然應該保持某種形式的聯繫,事實上,如果你不咬牙,你最終肯定會最終自己寫一個。 當你實現連接檢查以便它們不會過時時,某種連接持有者可以不必每次都重新打開它們,某種異常處理代碼......你可以得到我的漂移。
我已經使用了dbcpboneCP,兩者都非常易於使用和配置,並且可以節省處理JDBC連接問題的幾個小時的煩惱。
我對Guice不太熟悉,但我認爲它有一些方法可以爲Object提供您自己的工廠方法,因此您可以使用它從您的池中獲取連接,然後在完成後將其返回給對象,然後簡單地調用close()游泳池。
如果您使用的是Web服務器,則始終可以使用interceptorfilter將連接綁定到工作線程,並在處理完成後丟棄它們,在這種情況下,連接提供程序只需要抽出與當前線程綁定的連接提供程序。

+0

謝謝,bmorris591!我猜連接池是不可避免的 - 這可能不是負面的。必須是他們如此廣泛的原因:) – Skovly 2013-02-18 08:47:11

1

代之以注入Provider<Connection>,並讓提供者從可檢測陳舊條目的連接池中發出連接(編輯:在您需要時)。

未歸還的連接應從池中丟棄。

+0

好吧,我猜這樣一個提供程序實例會是什麼bmorris591談論時,他指的是提供自己的工廠方法的方式。 – Skovly 2013-02-18 08:28:54

+0

供應商是標準化的工廠。我發現這個抽象在Java中運行良好。 – 2013-02-18 08:35:01

+0

我還不確定我是否瞭解你,但我想我明白了。在我知道之前,我必須閱讀Guice Providers。但首先,看看我是否得到了要點:我應該使用此提供程序在每個方法開始時從池中獲取連接,然後在每個方法結束時關閉此連接回到池,因爲bmorris591描述了? – Skovly 2013-02-18 08:43:29

相關問題