使用ADO.Net对MySQL进行多线程访问

时间:2009-10-05 10:24:54

标签: c# mysql multithreading ado.net

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

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

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

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

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

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

// Some code using cmd

但是,我担心我还没有找到证明这是安全的文件,只是缺乏证明它不安全的文件。

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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

using语句可以帮助您:

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

连接将自动处理并返回连接池。

答案 2 :(得分:0)

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

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

据我所知,MySql Connector支持连接池,默认情况下已启用,所以让连接器担心管理连接池。