【问题标题】:LinqToSQL ExecuteReader requires an open and available ConnectionLinqToSQL ExecuteReader 需要一个打开且可用的连接
【发布时间】:2016-01-08 15:11:29
【问题描述】:

我知道这个问题已经被问过很多次了,但是没有一个答案适合我的问题。 我有一个线程计时器每 30 秒触发一次,它查询负载较重的 MSSQL 数据库。如果我需要更新我正在使用的控制台应用程序中的数据,我会使用 Linq To Sql 来更新存储在内存中的数据。

我的问题是有时我会收到错误 ExecuteReader requires an open and available Connection。

线程计时器的代码触发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 数据库添加了一个更大的线程池,但似乎没有任何帮助。

我在程序的其他部分也有 ADO,没有任何问题。

【问题讨论】:

  • 1. 重负载下的 MSSQL db 2. 每 30 秒 3. data.CommandTimeout = 560 4. 然后我做了很多 linqtosql 搜索。那不计算。我认为你至少应该看看一些缓存模式。

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


【解决方案1】:

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

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

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

【讨论】:

  • 同样的问题我想我需要使用 ado :(
  • @AndreDeMattia 注意:持续这么长时间的交易很少是个好主意
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多