我发现关于这个话题的信息非常少,希望有人能指导我一些信息和可能的示例代码。
一般来说,连接对象不是线程安全的(SqlConnect、MySqlConnection 和 OracleConnection 明确指出它们不是线程安全的)。
不要在多个线程之间共享同一个连接。
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
类和锁定如何工作的责任。没有样例代码是因为(几乎)没有人这样做,因为这是一个非常非常糟糕的想法。