繁体   English   中英

每个查询的新连接还是所有查询的一个连接? (CommandBehavior.CloseConnection 与 CommandBehavior.Default)

[英]New connection for each query or one connection for all queries? (CommandBehavior.CloseConnection vs CommandBehavior.Default)

我正在开发一个文本分析桌面应用程序,它集中查询本地数据库(MSSQLCE 3.5)。 当用户输入文本时,它应该实时反应,所以我使用 ADO.NET 和纯 SQL 并试图获得最佳性能结果。

问题是:根据我的任务,我应该保留一个缓存连接(作为 static 变量或单例)并使用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))
       { 
           ...
       }
    }
}

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

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

但无论如何,连接池默认情况下是打开的。 它应该为您处理所有这些问题。 是的,池化确实增加了开销,但并不大。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM