我正在使用一个使用 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 exception, 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 state&Obj, 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 System.Data 中的 .SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔异步,Int32 超时,任务和任务,布尔异步写入)。System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,Boolean returnStream,String 方法)在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)在 System.Data.Common.DbCommand.System.Data.IDbCommand .ExecuteReader()System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)处 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)处的 RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法)。 Common.DbCommand.System.Data.IDbCommand.ExecuteReader()System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,String 方法)处 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)处的 RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法)。 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;
}
}
}
一段时间后,程序能够恢复并继续其任务。我会认为这与此重复,但我没有使用数据库镜像,并且在 connection.open 上没有发生这种情况
我可以增加默认的超时时间,但我不确定这应该是一个问题。