2011-06-01 35 views
0

我正在開發一個文本分析桌面應用程序,密集查詢本地數據庫(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)) 
     { 
      ... 
     } 
    } 
} 

回答

0

個人而言,當我需要從非Web應用程序的快速連續很多疑問,我更喜歡使用一個共享的連接。

唯一的問題是您必須密切關注它,因爲它可能會因網絡問題意外降低,或者因爲SQL服務器認爲它最好關閉。也就是說,你必須處理StateChanged事件。

connection pooling無論如何都是默認打開的。它應該爲你處理所有這些問題。是的,合併會增加開銷,但並不大。

+0

感謝您的快速回答!我將看看StateChanged,但我想知道更多關於爲什麼以及何時SQL Server可以意外關閉連接。另外,我並不完全確定SQL Compact Edition 3.5 SP2提供程序支持共享。你給出的鏈接講述了(SQL SERVER 2008)。 – lonelyass 2011-06-01 11:49:13

+0

@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

+0

我發現了一個非常好的研究我的主題:http://csharponphone.blogspot.com/2007/01/keeping-sqlceconnection-open-and-thread.html 您可以使用一個SqlCeConnection來提高性能,但SqlCeConnection是不是主要安全的,所以如果你想使用這種策略,你必須爲數據庫訪問創建一個線程安全的包裝器。 「有趣的一面是:我在手機上創建了一個測試應用程序,該應用程序在共享的SqlCeConnection上啓動了50個線程,並隨機讀取/寫入隨機數據,沒有發生任何異常,當然,沒有錯誤意味着它會一直工作。「 – lonelyass 2011-06-03 19:32:24