簡體   English   中英

數據庫連接應該一直保持打開狀態還是只在需要時才打開?

[英]Should a database connection stay open all the time or only be opened when needed?

我有一個需要連接到數據庫的 bukkit 插件 (minecraft)。

數據庫連接應該一直保持打開狀態,還是在需要時打開和關閉?

數據庫連接必須僅在需要時打開,並在完成所有必要的工作后關閉。 代碼示例:

  • 在 Java 7 之前:

     Connection con = null; try { con = ... //retrieve the database connection //do your work... } catch (SQLException e) { //handle the exception } finally { try { if (con != null) { con.close(); } } catch (SQLException shouldNotHandleMe) { //... } }
  • 爪哇7:

     try (Connection con = ...) { } catch (SQLException e) { } //no need to call Connection#close since now Connection interface extends Autocloseable

但是由於手動打開數據庫連接成本太高,強烈建議使用數據庫連接池,用 Java 表示,帶有DataSource接口。 這將為您處理物理數據庫連接,當您關閉它時(即調用Connection#close ),物理數據庫連接將僅處於睡眠模式並且仍處於打開狀態。

相關問答:

一些處理數據庫連接池的工具:

取決於你的需求是什么。

創建連接需要一些時間,因此如果您需要頻繁訪問數據庫,最好保持連接打開。 此外最好創建一個池,以便許多用戶可以同時訪問數據庫(如果需要)。

如果你只需要使用這個連接幾次,你可能不會讓它保持打開狀態,但是當你想要訪問數據庫時會延遲。 所以我建議你制作一個計時器,讓連接保持打開一段時間(連接超時)。

您需要在每次查詢執行后關閉您的連接。有時您需要同時執行多個查詢,因為查詢彼此掛起。例如“先插入任務,然后將其分配給員工”。此時執行您的查詢同一個事務並提交它,如果發生一些錯誤,則回滾。默認情況下,JDBC 中禁用自動提交。 例子

使用連接池。如果您正在開發 Web 應用程序,則使用 App Server 連接池。App 服務器將為您的每個應用程序使用相同的池,以便您可以從一個點控制連接數。強烈推薦 Apache Tomcat 連接池。 例子

作為附加信息:Connection、Statement 和 ResultSet。

1.如果你關閉連接,你不需要關閉語句或結果集。它們都會自動關閉

2.如果你關閉 Statement 它也會關閉 ResultSet

3.如果你像這樣使用try-with-resources:

try (Connection con = ...) {
} catch (SQLException e) {
}

它會自動關閉連接。因為 try-with-resources 需要可自動關閉的對象,而 Connection 是可自動關閉的。您可以在此處查看有關 try-with-resources 的詳細信息

實際上,這完全取決於您如何編寫應用程序! 這是一門藝術,但遺憾的是,每個人都需要像 Microsoft 的教程這樣的良好實踐教程。

如果您知道自己在編碼什么,那么您就可以在應用程序的整個生命周期內保持連接打開。 很簡單,不是因為你早上要上班,而是每天都要為你打造一條特別的路線! 您像每個人一樣選擇那條路線或 2 條或 4 條路線! 您判斷交通情況,並根據需要構建 2、4 或 6 條路線。 如果這4、6條路線有流量,你就等着吧!

快樂編碼。

只有在需要時才應打開連接。 如果它在實際需要之前打開,它會從連接池中減少一個活動連接......因此它最終會影響應用程序的用戶。

因此,僅在需要時打開連接並在過程完成后關閉它始終是更好的做法。

始終嘗試將連接關閉邏輯放在 finally 塊中,以確保您的連接將被關閉,即使應用程序中發生任何異常

finally
{
connection.close()
}

每次連接都會有延遲,現在想象一下如果你總是連接和關閉會發生什么

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM