所有查询的每个查询或一个连接的新连接? (CommandBehavior.CloseConnection vs CommandBehavior.Default)

时间:2011-06-01 11:08:56

标签: c# .net sql ado.net sql-server-ce

我正在开发一个文本分析桌面应用程序,它集中查询本地数据库(MSSQLCE 3.5)。当用户抛出文本时,它应该实时响应,因此我将ADO.NET与纯SQL一起使用并尝试获得最佳性能结果。

问题是:基于我的任务,我应该保持一个缓存连接(作为静态变量或单例)并使用CommandBehavior.Default进行查询,还是应该为每个查询构建一个新连接并指定{{1} }?

我知道通常建议尽快关闭连接,但如果每分钟有数千个查询,例如当用户粘贴大量文本时,我应该真的这样做吗?

到目前为止,应用程序已在CloseConnection上运行。现在我尝试通过单一连接将其转换为CommandBehavior.Default。我可以看到一些小的性能加速,目前看不到任何问题,但我想知道是否附加了任何字符串,然后再将其用于部署。

CommandBehavior.CloseConnection

VS

// 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))
    { 

    }
}

1 个答案:

答案 0 :(得分:0)

就个人而言,当我从非Web应用程序快速连续地需要许多查询时,我更喜欢使用一个共享连接。

唯一的问题是你必须留意它,因为它可能由于网络问题而意外地下降,或者因为SQL服务器认为它最好被关闭。也就是说,您必须处理StateChanged事件。

但默认情况下connection pooling默认开启。它应该为您处理所有这些问题。是的,池化确实增加了开销,但它并不大。