【问题标题】:Multi-threaded access to MySQL using ADO.Net使用 ADO.Net 多线程访问 MySQL
【发布时间】:2010-12-03 21:45:00
【问题描述】:

我正在开发一个 ASP.Net Web 应用程序,该应用程序通过 MySQL 提供的连接器/NET 使用 MySQL,这是一个与 ADO.Net 兼容的接口。我对 ASP.Net 的理解是并发请求会在不同的线程中处理,所以我的代码需要是线程安全的。

我在 MySQL 文档中找不到任何明确解释如何以线程安全方式使用 API 的内容。 MySqlCommand 上的文档说:

这种类型的公共静态(在 Visual Basic 中为共享)成员对于多线程操作是安全的。不保证实例成员是线程安全的

我对此的字面理解是,在线程之间共享连接对象是安全的,只要我不同时调用非静态方法。换句话说,我应该能够做到:

IDbConnection myConnection = GetSomeConnection(); // Returns a shared object
IDbCommand cmd;

lock(myConnection)
{
    cmd = myConnection.CreateCommand();
}

// Some code using cmd

但是,我担心我还没有找到说明这是安全的文档,只是缺少说明它不安全的文档。

如果这是不安全的,推荐使用线程本地连接的方法,还是我应该实现某种连接池?

【问题讨论】:

    标签: c# mysql multithreading ado.net


    【解决方案1】:

    仅在需要时使用 IDbConnection,并在完成 SQL 查询后立即处理它。该连接将返回到连接池,并在您下次打开具有相同连接字符串的连接时被另一个线程重用,即使它是另一个线程。这里不需要做任何锁定。

    【讨论】:

      【解决方案2】:

      using 语句可能对您有所帮助:

      using(IDbConnection myConnection = GetSomeConnection()){  
         IDbCommand cmd = myConnection.CreateCommand();  
      }
      

      连接将被自动释放并返回连接池。

      【讨论】:

        【解决方案3】:

        不要跨线程共享您的连接。让您的连接对象保持线程本地,尽可能晚地打开它们并尽可能早地关闭它们(最好使用using 块)。

        using (MySqlConnection conn = new MySqlConnection("..."))
        {
            // do work
        }
        

        据我所知,MySql 连接器支持连接池并且默认启用,所以只需让连接器操心管理连接池即可。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-11-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多