コードリファクタリングが原因で問題が発生しました。この場合の最善の解決策は何ですか?
問題は、DbConnectionがローカルメソッド変数からクラス変数にリファクタリングされたことです。アプリケーションはマルチスレッドです。問題は、DbConnectionオブジェクトがメンバー変数である場合に共有されることにあるようです。最善の解決策は何ですか?ローカルメソッド変数として残しますか?
public IDataReader Execute(CommandBehavior behavior, string[] parameterNames, object[] arguments)
{
DbConnection conn = null;
try
{
conn = Connection.CreateConnection();
DbCommand cmd = conn.CreateCommand();
cmd.CommandText = StoredProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
// ..................................................
// Perform the call.
return DataCachingContext.SetCachedData(call, cmd.ExecuteReader(behavior));
}
catch (Exception ex)
{
//..........................
}
finally
{
//
}
}
明確にするために、ここに問題を引き起こすバージョンがあります。実行時の例外、ResultSetへのインデックス作成の問題を除いて、これは接続が上書きされていることが原因である可能性があります。
DbConnection _conn = null;
public IDataReader Execute(CommandBehavior behavior, string[] parameterNames, object[] arguments)
{
try
{
_conn = Connection.CreateConnection();
DbCommand cmd = _conn.CreateCommand();
cmd.CommandText = StoredProcedureName;
cmd.CommandType = CommandType.StoredProcedure;
// ..................................................
// Perform the call.
return DataCachingContext.SetCachedData(call, cmd.ExecuteReader(behavior));
}
catch (Exception ex)
{
//..........................
}
finally
{
//
}
}
さらに調査したところ、ユニットテストを可能にするためにDbConnection変数がクラス変数になっているようです。ローカル変数の場合、その値をテストする方法はありません。DbConnectionの状態がテストされていました