我正在使用一个使用Parallel.foreach进行线程处理的控制台应用。 它是使用.net 4.5 vs 2012开发的,它将数据检索并插入到现场的sql server(2008 r2)中。因此,应该没有网络问题,因为sql server是本地的。我的应用程序是目前唯一一个使用数据库的应用程序我同时从多个线程获得了大量的超时。是什么让这更令人困惑的是我可以一遍又一遍地调用这个应用程序,但有一次我得到了超时。也许这很简单,因为增加超时但我不知道是否还有其他事情发生
这是我正在调用的存储过程
Select table.Id from Table WITH (NOLOCK)
inner join table2 c WITH (NOLOCK) on c.Id = table.TableId
inner join Table3_xref x WITH (NOLOCK) on x.TableID = c.id
inner join Table4 p WITH (NOLOCK) on p.id = x.id
where
value = @Parm1
and p.Value1 = @Parm2
and c.Value2 = @Parm3
and Table.Void = 0
这是例外
System.Data.SqlClient.SqlException(0x80131904):超时已过期。操作完成之前经过的超时时间或服务器没有响应。 ---> System.ComponentModel.Win32Exception(0x80004005):等待操作超时
在System.Data.SqlClient.SqlConnection.OnError(SqlException异常,Boolean breakConnection,Action 1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)
在System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj,Boolean callerHasConnectionLock,Boolean asyncClose)
在System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj,Boolean& dataReady)
在System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()
在System.Data.SqlClient.SqlDataReader.get_MetaData()
在System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,String resetOptionsString)
在System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,Boolean async,Int32 timeout,Task& task,Boolean asyncWrite)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String方法,TaskCompletionSource`1完成,Int32超时,任务和任务,布尔asyncWrite)
在System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String method)
在System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior,String method)
在System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior行为)
在System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
这是我的代码看起来像
try
{
using (DbConnection con = Database.CreateConnection())
{
IDbCommand cmd = new SqlCommand(sSQL, (SqlConnection)con);
cmd.CommandType = CommandType.StoredProcedure;
con.Open();
IDataReader reader = cmd.ExecuteReader();
if (reader.Read())
{
result = true;
}
}
}
一段时间后,程序能够恢复并继续执行任务。我认为这是this的重复,但我没有使用数据库镜像,这在connection.open上没有发生。
我可以增加默认时间,但我不确定这应该是一个问题。