LinqToSQL ExecuteReader需要一个打开且可用的连接
本文关键字:连接 一个 ExecuteReader LinqToSQL | 更新日期: 2023-09-27 18:29:28
我知道这个问题被问了很多次,但没有一个答案适合我的问题。我有一个线程计时器每30秒启动一次,用于查询负载过重的MSSQL数据库。如果我需要更新我正在使用的控制台应用程序中的数据,我会使用Linq to Sql来更新存储在内存中的数据。
我的问题是,有时我会收到错误ExecuteReader需要一个打开且可用的连接。
线程计时器的代码触发Thread.Run(reload());
连接字符串为
//example code
void reload(...
string connstring = string.Format("Data Source={0},{1};Initial Catalog={2};User ID={3};Password={4};Application Name={5};Connect Timeout=120;MultipleActiveResultSets=True;Max Pool Size=1524;Pooling=true;"
settings = new ConnectionStringSettings("sqlServer", connstring, "System.Data.SqlClient");
using (var tx = new TransactionScope(TransactionScopeOption.Required,
new TransactionOptions() { IsolationLevel = IsolationLevel.ReadUncommitted }))
{
using (SwitchDataDataContext data = new SwitchDataDataContext(settings.ConnectionString))
{
data.CommandTimeout = 560;
然后我做了很多linqtosql搜索。异常不时发生,但并不总是发生在同一个查询上。这就像连接被打开,然后被强制关闭
有时,异常显示当前状态为"打开"、"关闭"、"正在连接"。我在SQL数据库中添加了一个更大的ThreadPool,但似乎没有任何帮助。
我在程序的其他部分也有ADO,没有任何问题。
我认为您的问题是事务范围也有超时。根据此答案,默认超时为1分钟。因此,事务在您的命令执行之前很久就超时了(560秒=9.3分钟左右)。您需要在创建的TransactionOptions对象的实例中设置超时属性
new TransactionOptions()
{
IsolationLevel = IsolationLevel.ReadUncommitted,
Timeout = new TimeSpan(0,10,0) /* 10 Minutes */
}
您可以通过将TransactionScope超时设置为一个小值来强制超时,从而验证这确实是问题所在。
我将Linq To Sql更改为Entity Framework,并收到了相同类型的消息。我认为问题是懒惰加载。在另一个线程上准备好之前,我一直在使用这些集合。我刚刚添加了。将("Lab")包含到我的收藏中以加载整个收藏,这似乎解决了问题。