3

我正在使用一个使用 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, Action1 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 上没有发生这种情况

我可以增加默认的超时时间,但我不确定这应该是一个问题。

4

0 回答 0