由於代碼重構而出現問題,在這種情況下最好的解決方案是什麼?製作可變線程安全的最佳方式是什麼?
問題是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的狀態正在測試中
最好的方法是研究[標籤:線程安全]和[標籤:多線程]。這個問題在這裏被問了數百次;可能已經被問過_today_。 – 2012-08-13 14:53:42
我在這裏沒有看到任何問題,除了你說DbConnection是一個類變量,在這裏它顯然是一個局部變量,你有兩次聲明嗎?如果這不是問題,我們需要更多細節。 – crlanglois 2012-08-13 14:55:56
我在代碼中看不到任何線程。 DataCachingContext是共享對象嗎?它是「靜態」嗎? – 2012-08-13 14:59:08