由于代码重构而出现问题,在这种情况下最好的解决方案是什么?制作可变线程安全的最佳方式是什么?
问题是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