簡體   English   中英

如何安全地使用ADO.NET IDbConnection和IDbCommand同時執行多個數據庫命令?

[英]How do I safely use ADO.NET IDbConnection and IDbCommand to execute multiple database commands concurrently?

目標

考慮到在運行時指定了ADO.NET實現 ,使用ADO.NET IDbConnection和IDbCommand可以針對同一個數據庫同時執行多個命令。

調查

IDbConnection的MSDN文檔未指定任何線程限制。 SqlConnection頁面有標准免責聲明“ 任何實例成員都不保證是線程安全的。IDbCommandSqlCommand文檔同樣沒有信息。

假設沒有單個實例成員是線程安全的,我仍然可以從連接創建多個命令(在同一個線程上),然后在不同的線程上同時執行它們。

據推測,這仍然無法達到預期的效果,因為(我假設)在數據庫的單個底層連接上一次只能執行一個命令。 因此,並發IDbCommand執行將在連接處被序列化。

結論

所以這意味着我們必須創建一個單獨的IDbConnection ,如果你知道你正在使用SqlConnection ,那SqlConnection因為它支持池化。 如果在運行時確定了ADO.NET實現,則無法進行這些假設。

這是否意味着我需要實現自己的連接池以支持對數據庫的高性能多線程訪問?

如果在一個線程上創建連接,則不應在其他線程上使用它。 命令也是如此。

但是,您可以在每個線程上創建連接,並在其自己的線程上安全地使用這些對象。

池化用於創建大量短期連接對象時。 這意味着重用底層(昂貴)數據庫連接。

缺口

您將需要管理對實例成員的線程訪問,但大多數ADO實現都管理自己的連接池。 他們通常希望同時運行多個查詢。

我可以隨意打開和關閉盡可能多的連接,並處理如果池不可用則可能拋出的異常。

這是一篇關於ADO連接池的文章

暫無
暫無

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

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