代码之家  ›  专栏  ›  技术社区  ›  Tim Martin

使用ADO.NET多线程访问MySQL

  •  2
  • Tim Martin  · 技术社区  · 15 年前

    我正在开发一个ASP.NET Web应用程序,它通过MySQL提供的connector/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
    

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

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

    3 回复  |  直到 15 年前
        1
  •  1
  •   Julien Lebosquain    15 年前

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

        2
  •  1
  •   jerjer    15 年前

    使用语句可以帮助您:

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

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

        3
  •  0
  •   LukeH    15 年前

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

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

    据我所知,mysql连接器支持连接池,默认情况下它是启用的,所以让连接器担心管理连接池。