スレッド化の目的でParallel.foreachを使用しているコンソールアプリを使用しています。これは、サイトにあるSQLサーバー(2008 r2)にデータを取得して挿入する.net 4.5vs2012を使用して開発されました。したがって、SQLサーバーはローカルであるため、ネットワークの問題は発生しないはずです。現在、データベースを使用しているのは私のアプリケーションだけです。同時に複数のスレッドから大量のタイムアウトが発生しています。これをさらに混乱させるのは、このアプリケーションを何度も呼び出すことができるのに、一度はタイムアウトになることです。タイムアウトを増やすだけの簡単なことかもしれませんが、他に何か起こっているのではないかと思います
これは私が呼び出しているストアドプロシージャです
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例外、ブール値breakConnection、アクションで待機操作がタイムアウトしました1 wrapCloseInAction)
at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action
1 wrapCloseInAction)at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj、Boolean callerHasConnectionLock、Boolean asyncClose)at System.Data.SqlClient.TdsParser.TryRun(RunBehavior runBehavior、SqlCommand cmdHandler、SqlDataReader dataStream、Copy dataReady)at System.Data.SqlClient.SqlDataReader.TryConsumeMetaData()at System.Data.SqlClient.SqlDataReader.get_MetaData()at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds、RunBehavior runBehavior、String resetOptionsString)at System.Data .SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、Boolean async、Int32 timeout、Task&task、Boolean asyncWrite)atSystem.Data。System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runB)でのSqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、Boolean returnStream、String method、TaskCompletionSource`1 complete、Int32 timeout、Task&task、Boolean asyncWrite) returnStream、String method)at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior Behavior、String method)at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior Behavior)at System.Data.Common.DbCommand.System.Data.IDbCommand .ExecuteReader()RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、String method)at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior Behavior、String method)at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior Behavior)atSystem.Data。 Common.DbCommand.System.Data.IDbCommand.ExecuteReader()RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior runBehavior、Boolean returnStream、String method)at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior Behavior、String method)at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior Behavior)atSystem.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;
}
}
}
しばらくすると、プログラムは回復してタスクを続行できるようになります。これはこれと重複していると思いますが、データベースミラーリングを使用しておらず、connection.openでは発生していません。
デフォルトからタイムアウトを増やすことはできますが、これが問題になるかどうかはわかりません。