3

スレッド化の目的で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, Action1 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では発生していません。

デフォルトからタイムアウトを増やすことはできますが、これが問題になるかどうかはわかりません。

4

0 に答える 0