2009-10-05 48 views
2

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

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

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

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

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

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

// Some code using cmd 

不过,我很担心,我还没有发现的文件指出,这是安全的,只是说明它缺乏文件是不安全的。

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

回答

1

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

1

using语句可以帮助你:

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

连接将被自动设置并返回到连接池。

0

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

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

据我所知,MySQL的连接器支持连接池,它在默认情况下启用,所以才让有关管理连接池的连接器担心。