2009-01-16 108 views
5

我有興趣瞭解數據庫如何處理由啓動連接的實體未明確關閉的連接。數據庫和連接

  1. 說我有一個數據庫,一次只能接受2個併發連接。我有一段代碼可以打開一個連接,並且永遠不會關閉它。這段代碼永遠運行,但它在它的生命週期中只使用連接一次,但連接對象永遠不會超出範圍,所以它不會被垃圾收集。假設我運行這個代碼的2個實例。這是否意味着,直到程序終止或連接超時(由於不活動),數據庫才能接受更多連接?

  2. 在上面的場景中,如果連接對象是垃圾回收,那麼連接是否會自動終止,還是依賴於我正在使用的數據庫驅動程序,或者直到我明確關閉連接才終止連接?

  3. 如果我用一段代碼打開一個連接,並且沒有明確關閉連接,但程序終止,那麼數據庫如何回收該連接?

回答

4

底層協議數據庫連接的典型地是基於TCP/IP。可以通過以下幾種方式之一終止連接:

  1. 服務器正常關閉並收到來自客戶端的確認;
  2. 客戶端關閉正常,並收到來自服務器的確認;
  3. 連接超時。客戶端和服務器分別由各自的操作系統告知連接已關閉;
  4. 連接被任何一方強制關閉。

在(3)的情況下,TCP連接必須通過每隔一段時間發送一次虛擬消息來保持活動狀態以避免超時。你的連接可能會超時,因爲任何一方都不這樣做(對於數據庫連接,這通常不是你通常想要做的事情)。

一方有時間認爲連接已關閉,而另一方仍然認爲連接已打開,這是完全可能的。消息可能會在這些情況下發送(通常會丟棄)。

每個連接(「套接字」)使用操作系統資源,稱爲文件描述符(用UNIX的說法,您的操作系統可能會調用它),它是I/O資源的句柄和相同的東西用於打開文件(同樣,操作系統可能會有所不同)。

上的數據庫連接上的限制將是最低的:對於OS

  • 配置的限制;
  • 該進程允許的最大文件描述符(減去任何用於I/O活動的文件描述符);和
  • (可能)有關連接限制的系統設置或策略。

如果連接不是基於TCP的(例如文件系統套接字,就像UNIX系統中經常與MySQL一起使用的文件系統套接字),原理實際上非常類似。

無論如何,故事的寓意在於數據庫連接 - 無論其形式如何 - 都涉及某種操作系統資源。您的程序hsa直接或間接要求提供該資源。如果程序死亡,操作系統將回收它(可能不是立即但最終)。如果連接被垃圾收集,那麼資源將以與被強制關閉相同的方式被釋放。

它的外部資源(而不是客戶端使用的代碼)將持續打開並驅動任何限制。

4

回答您的問題依次是:

  1. 是的,也許。除非通過「併發連接」,否則實際上是指「併發查詢」。如果你打開數據庫連接,它是打開的。

  2. 垃圾收集可能會或可能不會清理連接。取決於使用的語言和數據庫驅動程序。 (垃圾回收可能僅限於回收內存,而不是像TCP連接那樣的資源。)

  3. 當程序終止時,通常操作系統負責清理它使用的所有資源。這包括關閉TCP等連接。因此,對於大多數連接類型,數據庫將被通知對方關閉了連接。