我发现关于这个主题的信息非常少,希望有人可以指导我获取一些信息和可能的示例代码。
答案 0 :(得分:10)
通常连接不是线程安全的(SqlConnection,MySqlConnection和OracleConnection特别提到它们不是线程安全的。)
不要在线程之间共享连接。
答案 1 :(得分:6)
我想说不要共享连接对象本身,只需创建一个新连接,让ADO.net处理连接池。
答案 2 :(得分:3)
要回答问题的实际参数,而不是解雇它们,我会打包DbCommand
以帮助同步对连接的访问(当且仅当你绝对需要时)。
public class SyncedDbCommand : DbCommand
{
private DbCommand _cmd;
private object _sync;
public SyncedDbCommand(DbCommand cmd, object sync)
{
_cmd = cmd;
_sync = sync;
}
// omitted basic proxy method overrides
protected override DbDataReader ExecuteDbDataReader(CommandBehavior behavior)
{
Monitor.Enter(_sync);
return _cmd.ExecuteReader();
}
public override int ExecuteNonQuery()
{
Monitor.Enter(_sync);
return _cmd.ExecuteNonQuery();
}
public override object ExecuteScalar()
{
Monitor.Enter(_sync);
return _cmd.ExecuteScalar();
}
protected override void Dispose(bool disposing)
{
if (disposing)
{
Monitor.Exit(_sync);
}
base.Dispose(disposing);
}
}
要使用该示例,您必须使用实际的DbCommand
以及在连接的所有用法中共享的某个对象实例对其进行实例化。在最简单的使用中,您甚至可以将连接对象本身作为锁定对象传递。实例化应该在using
语句中进行。这并不能免除您确切了解您的使用要求以及Monitor
类和锁定的工作方式。
您希望以某种方式同步跨线程的连接使用,以上是一种方法。
答案 3 :(得分:0)
野外没有示例代码,因为(几乎)没有人这样做,因为它是一个非常非常糟糕的主意。