Pau*_*rth 8 .net c# sql-server connection-pooling
我们有一些客户端代码,它使用.NET中的SqlConnection类与SQLServer数据库通信.它会间歇性地失败并出现此错误:
"ExecuteReader需要一个开放且可用的连接.连接的当前状态为Closed"
"临时"解决方案是重新启动过程,之后一切正常 - 但是,这显然不能令人满意.
代码保留了SqlConnection实例的缓存,每个数据库一个.
我们想重新编写代码,但在此之前,我需要了解一些事情:
我的第一个问题是:重复连接和断开SqlConnection对象是否效率低下,或者底层库是否代表我们执行连接池?
// Is this bad/inefficient?
for(many-times)
{
using(SQLConnection conn = new SQLConnection(connectionString))
{
// do stuff with conn
}
}
Run Code Online (Sandbox Code Playgroud)
因为我们的代码不能执行上述操作,所以问题的可能原因似乎是在连接的"生命周期"期间底层SQLServer数据库发生了某些事情,导致连接被关闭...
如果事实证明"缓存"SqlConnection对象是值得的,那么建议的方法是处理所有可以通过"重新连接"到数据库来解决的错误.我在谈论的场景如下:
我注意到SqlConnection上有一个"State"属性...是否有适当的方法来查询?
最后,我有一个测试SQLServer实例设置了完全访问权限:我怎样才能再现确切的错误"ExecuteReader需要一个开放的可用连接.连接的当前状态是关闭的"
Jon*_*eet 20
不,创建大量SqlConnection对象并在完成后关闭每个对象并不低效.这是正确的做法.让.NET框架连接池完成它的工作 - 不要试图自己动手.您无需执行任何特定于启用连接池的任何操作(尽管您可以通过设置Pooling=false连接字符串来禁用它).
如果您尝试自己缓存连接,可能会出现许多问题.拒绝吧 :)
| 归档时间: |
|
| 查看次数: |
11383 次 |
| 最近记录: |