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

时间:2009-12-01 21:10:01

标签: c# multithreading

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

4 个答案:

答案 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)

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