LinqToSQL ExecuteReader需要一个开放且可用的连接

时间:2016-01-08 15:11:30

标签: c# sql-server linq-to-sql

我知道这个问题已被多次询问,但没有一个答案适合我的问题。 我有一个线程计时器每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,没有任何问题。

2 个答案:

答案 0 :(得分:0)

我认为您的问题是事务范围也有超时。根据{{​​3}},默认超时为1分钟。因此,事务在命令执行前很久就会超时(560秒= 9.3分钟左右)。您需要在正在创建的TransactionOptions对象的实例中设置timeout属性

new TransactionOptions()
{ 
    IsolationLevel = IsolationLevel.ReadUncommitted, 
    Timeout = new TimeSpan(0,10,0) /* 10 Minutes */ 
}

您可以通过将TransactionScope超时设置为较小的值来强制它超时来验证确实是问题。

答案 1 :(得分:0)

我将Linq To Sql更改为Entity Framework并收到了相同类型的消息。我相信问题是懒惰的加载。我在不同的线程上准备好之前就使用了这些集合。我刚刚在我的集合中添加了.Include(" Lab")来加载整个集合,它似乎解决了这个问题。