在C#应用程序中的线程之间共享数据库连接?

我发现关于这个主题的信息很少,希望有人可以指导我一些信息和可能的示例代码。

通常连接不是线程安全的(SqlConnection,MySqlConnection和OracleConnection特别提到它们不是线程安全的)。

不要在线程之间共享连接。

我会说不要共享连接对象本身,只需创建一个新连接,让ADO.net处理连接池。

为了响应问题的实际参数,而不是解雇它们,我将包装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类和锁定的工作方式。

无论如何,您希望跨线程同步连接的使用,以上是这样做的一种方法。

野外没有示例代码,因为(几乎)没有人这样做,因为它是一个非常非常糟糕的主意。