我知道这个问题已被多次询问,但没有一个答案适合我的问题。 我有一个线程计时器每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,没有任何问题。
答案 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")来加载整个集合,它似乎解决了这个问题。