C# MySQL连接池技术

10

我有一个 C# 多线程 应用程序,并且在整个应用程序中使用单个连接的 MySQL。但是当两个或多个线程尝试同时访问数据库时,我会收到以下错误:

已经有一个与此连接相关联的打开的 DataReader 必须首先关闭。

我的连接代码如下:

public static _connectionSetup = new MySqlConnection("Server=server ; Database=database;User ID=user;Password=pass;Pooling=true;");

当我需要使用连接时,我使用以下代码:

using (MySqlConnection connection =_connectionSetup )
{
    using (MySqlCommand command = new MySqlCommand("proc", connection))
    {
        ....
    }
}

我尝试使用了 pooling=true,并为两个不同的线程创建了两个独立的连接,但仍然出现了上述错误。
我是否漏掉了什么?

如何实现连接池,以便所有线程都使用单独的连接,并且不会引起任何问题?


10
不要将其设为静态,使用using创建连接,问题就解决了。 https://dev59.com/a2kw5IYBdhLWcg3ws8xj#9707060 - Tim Schmelter
不, 请阅读我在上面链接中的回答,它会比我在评论中做得更好。 - Tim Schmelter
谢谢提供的链接,非常有帮助。我是C#的新手,根据链接所述,当我们关闭连接时,它将返回到ADO.NET连接池,而不是从服务器关闭连接。我不确定如果我写new MySqlConnection("Server=ser....是否是ADO.NET?(上面的代码中我是否在使用ADO.net?我不知道)如果我将_connectionSetup实例变量设置为连接,那么当我使用实例变量打开连接时,它会再次连接到数据库服务器还是从池中获取连接以进行第二次或更多次连接。 - Varun Jain
这都是ADO.NET。但这取决于您是否使用连接池。是的,对于MySql(以及其他DBMS如Sql-Sever),默认情况下启用了连接池。在连接字符串中添加 Pooling=True; 不会有任何损害。但是,请注意,这是默认行为。简而言之,如果在连接字符串中未指定 pooling=false,则已启用连接池 - Tim Schmelter
让我们在聊天中继续这个讨论 - Tim Schmelter
显示剩余5条评论
1个回答

24

默认情况下已启用连接池,因此您不需要这个连接字符串参数。

不要共享MySqlConnection实例。就是这样。

连接池不是您在代码中实现的东西,它由ADO.NET为您完成。


4
我会尽力完成您的翻译要求。以下是内容的翻译:我没有使用 ADO.NET,而是使用自己的代码来获取和保存数据。如何确保每个后台工作线程都使用单独的连接,并避免出现上述错误? - Varun Jain

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接