2008-12-07 19 views
1

有一個用例,其中需要維護一個打開數據庫的連接以便定期執行查詢。在JDBC中輪詢數據庫時重用連接?

建議在執行查詢後關閉連接,然後在週期間隔(10分鐘)後重新打開該連接。因爲打開與數據庫的連接是昂貴的,所以我猜想不會。

連接池是否可替代並繼續使用連接?

回答

6

您應該使用連接池。編寫您的應用程序代碼以請求池中的連接,使用連接,然後將連接返回到池。這可以保持您的代碼清潔。然後,您需要依靠池實現來確定管理連接的最有效方式(例如,保持打開狀態並關閉連接)。

通常,由於建立TCP/IP連接,身份驗證等的開銷,開放連接是「昂貴的」。但是,保持連接打開「太長」也是昂貴的,因爲數據庫(可能)已經保留了連接使用的資源(如內存)。所以保持連接打開可以捆綁這些資源。

您不想污染管理這些類型效率權衡的應用程序代碼,因此請使用連接池。

+0

感謝您的回覆。我遇到了確切的問題,你的答覆救了我。 Upvote給你。 但我有另一個問題。通過連接池,連接被集中。那麼會不會導致一些數據庫資源被保留? – Sid 2011-08-11 22:11:01

1

是的,連接池是替代選擇。每次打開連接(就代碼而言)並儘可能快地關閉連接。連接池將以適當高效的方式處理物理連接(包括任何需要的keepalive,偶爾的「活躍」測試等)。

我不知道當前的技術水平如何,但我最近使用的c3p0非常成功地用於涉及JDBC(最近一段時間)的最後一個Java項目。

0

連接池將是您的選擇。然後,您可以保留原有的代碼,包括打開和關閉連接。連接池將關心連接。如果關閉池的連接,它將不會關閉,而只會再次在池中提供。如果在關閉一個連接後打開連接(如果池中存在打開的連接),池將返回此連接。因此,在應用程序服務器中,您可以使用內置連接池。對於簡單的Java應用程序,大多數JDBC驅動程序還包含一個池驅動程序。

1

這裏的答案實際上取決於應用程序。如果同一應用程序中同時使用其他連接,則池肯定是您的答案。

如果您的所有應用程序都在查詢數據庫,請等待10分鐘,然後重新查詢,然後簡單地連接並重新連接。連接被認爲是一個昂貴的操作,但所有的事情都是相對的。如果每10分鐘只做一次,這並不昂貴。如果應用程序很簡單,不要引入不必要的複雜性。 OK,複雜性也是相對的,所以如果已經在使用像Spring這樣的東西,並且已經知道如何使用它的池化機制,那麼將它應用於這種情況。如果不是這樣,請保持簡單。

0

打開和關閉連接有很多很多折衷因素,請保持打開狀態,確保已經「保持活動狀態」的連接在您再次使用它們時仍然「有效」,使連接失效,等等這些複雜的折衷使得爲特定情況實施「最佳」連接管理策略變得困難(但肯定不是不可能)。 「最安全」的方法是打開連接,使用它,然後關閉它。但是,正如你已經意識到的那樣,這並不是最有效的方法。如果您管理自己的連接,那麼隨着您的操作使策略更加高效,複雜性將會非常迅速地上升(特別是在存在任何不完善的JDBC驅動程序(其中存在許多此類驅動程序)的情況下。)

有很多可用的連接池庫,可以以極其可配置的方式爲您處理所有這些(它們幾乎總是在大多數典型情況下都是預先配置好的,直到您起牀以至於您正在進行高負荷活動時,您可能不必擔心所有可配置性 - 但如果按比例放大,您將很高興擁有它)。總是如此,這些庫本身可能質量參差不齊。

我已經成功使用了C3P0Apache DBCP。如果我今天再次選擇,我可能會去DBCP。