我正在開發一個文本分析桌面應用程序,密集查詢本地數據庫(MSSQLCE 3.5)。隨着用戶投入文本,它應該實時響應,所以我使用ADO.NET和純SQL並試圖獲得最佳性能結果。每個查詢的新連接或所有查詢的一個連接? (CommandBehavior.CloseConnection與CommandBehavior.Default)
問題是:基於我的任務,我應該保留一個緩存的連接(作爲靜態變量或單例)並使用CommandBehavior.Default
進行查詢,還是應該爲每個查詢建立一個新連接並指定CommandBehavior.CloseConnection
?
我知道通常建議儘快關閉連接,但是我應該真的這樣做,如果每分鐘可以有數千個查詢,例如用戶粘貼大量文本時?
到目前爲止,應用程序在CloseConnection上工作。現在我試圖用單連接將它變成CommandBehavior.Default。我可以看到一些小的性能加速,目前看不到任何問題,但是我想知道是否有任何附加的字符串,然後再進行部署。
// one cached connection for all queries
private static DbConnection _connection = null;
public static String MakeQuery()
{
if (_connection == null)
{
_connection = new SqlCeConnection(...);
_connection.Open();
}
var cmd = new SqlCeCommand("...", _connection);
using (var reader = cmd.ExecuteReader(CommandBehavior.Default))
{
}
}
與
// new connection for each query
public static String MakeQuery()
{
using (var connection = new SqlCeConnection(...))
{
connection.Open();
var cmd = new SqlCeCommand("...", connection);
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection))
{
...
}
}
}
感謝您的快速回答!我將看看StateChanged,但我想知道更多關於爲什麼以及何時SQL Server可以意外關閉連接。另外,我並不完全確定SQL Compact Edition 3.5 SP2提供程序支持共享。你給出的鏈接講述了(SQL SERVER 2008)。 – lonelyass 2011-06-01 11:49:13
@lonelyass這篇文章讓我覺得它是ADO.NET維護池,而不是實際的數據提供者... [我可能是錯誤的](http://www.eggheadcafe.com/software/aspnet/30031355/sql-緊湊版 - 連接池 - slow.aspx)。關於意外關閉連接,似乎我錯了,因爲[CE沒有死鎖檢測](http://msdn.microsoft.com/en-us/library/ms172453(v = SQL.100).aspx )。我正在回答這個問題。 – GSerg 2011-06-01 14:38:00
我發現了一個非常好的研究我的主題:http://csharponphone.blogspot.com/2007/01/keeping-sqlceconnection-open-and-thread.html 您可以使用一個SqlCeConnection來提高性能,但SqlCeConnection是不是主要安全的,所以如果你想使用這種策略,你必須爲數據庫訪問創建一個線程安全的包裝器。 「有趣的一面是:我在手機上創建了一個測試應用程序,該應用程序在共享的SqlCeConnection上啓動了50個線程,並隨機讀取/寫入隨機數據,沒有發生任何異常,當然,沒有錯誤意味着它會一直工作。「 – lonelyass 2011-06-03 19:32:24