我正在开发一个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
但是,我担心我还没有找到证明这是安全的文件,只是缺乏证明它不安全的文件。
如果这是不安全的,建议使用线程本地连接,还是应该实现某种连接池?
答案 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支持连接池,默认情况下已启用,所以让连接器担心管理连接池。