2014-03-07 44 views
1

所以我有一個無限期地作爲TCP服務器運行的Java進程(接收來自另一個進程的消息,並且有onMsg處理程序)。何時必須關閉數據庫連接? (Java)

我想對Java程序中的消息進行處理的一件事是使用與postgres的數據庫連接將其寫入磁盤。現在,我有一個靜態連接對象,每次有消息進入時我都會調用它。我不關閉並重新打開每條消息的連接。

我對Java還是有點新,我想知道1)使用一個無限期連接的對象是否有任何缺陷或危險,以及2)是否有性能優勢,永不關閉連接,而不是每次我想要打開數據庫時重新打開/關閉?

感謝您的幫助!

+0

看看[這](http://stackoverflow.com/questions/3332074/what-are-the-disadvantages-of-using-persistent-connection-in-pdo)答案。儘管這是針對PHP的,但它仍然會回答你爲什麼不必要地打開連接是不好的。 –

回答

6

我不關閉並重新打開每封郵件的連接。

是的,你做......至少就簡單的Connection對象而言。否則,如果您的連接斷開,它將永遠被破壞,如果您需要同時執行多個操作,則會遇到問題。

你想要的是一個連接池來管理到數據庫的「真實」連接,並且您只需要從池中爲每個操作請求連接,並在完成後關閉它。關閉「邏輯」連接只是將「真實」連接返回到池以進行其他操作。 (池可以處理保持連接活躍與心跳,隨着時間的推移退休連接等)

有很多連接池技術可用,並且它已經很長時間,因爲我已經使用「普通」的JDBC,所以我不想說現在的藝術狀態在哪裏 - 但這是你可以爲自己做的研究:)

3

創建數據庫連接總是性能問題。只有非常幼稚的實現才能爲每個操作創建和關閉連接。如果你只需要一小時做一次,那麼這是可以接受的。但是,如果您有一個程序每分鐘執行多次數據庫訪問(對於較大的應用程序甚至每秒執行一次),則您不希望實際關閉連接。

那麼你什麼時候關閉連接?簡單的答案:讓連接池爲您處理。你問游泳池一個連接,它會給你一個開放的連接(它有緩存,或者如果真的需要的話,一個全新的連接)。當你完成你的查詢時,你的連接是close(),但實際上它只是返回連接池。

對於設置連接池的非常簡單的程序來說可能是額外的工作,但這並不是非常困難,而且絕對是您想要獲得的東西。有幾個開源連接池,如Apache的DBCP3CPO