c# - 具有许多异步插入的 MySQL 连接器池

标签 c# .net-4.0 task-parallel-library mysql-connector

我正在阅读有关 MySQL: Using Connector/Net with Connection Pooling 的内容。建议不要使用全局 MySqlConnection 对象并手动打开/关闭它。此外,建议使用 MySqlHelper 而不是使用 MySqlCommand 对象。

因此,假设我有一个 CONNECTION_STRING 设置,我可以执行以下操作:

MySqlHelper.ExecuteNonQuery(CONNECTION_STRING,
    @"INSERT INTO `table1` (`col3`,`col4`) VALUES (@col3, @col4 );",
    (new List<MySqlParameter>() {
                new MySqlParameter("@col3", @"another value"),
                new MySqlParameter("@col4", @"some value")    
            }).ToArray()
    );

现在,想象一下我在异步并行任务中(通过 TPL)进行了数千次上述调用。

我的 MySQL 服务器上有一些允许的最大连接数,并且我开始抛出异常,声称用户已超出最大连接数。我认为连接池应该自动为我处理这个问题?驱动程序不是应该自动为我池化和排队吗?

我当前允许的最大连接数为 1500,我将其添加到我的连接字符串中:

Pooling=True;minimumPoolSize=0;maximumpoolsize=100;

但是,我仍然超出了最大连接数。我需要一些关于如何处理许多异步插入而不超出最大连接限制的建议。

最佳答案

除了 max_connections 之外,max_user_connections 在这里也很重要。可以查询:

show variables like 'max_user_connections';

为了避免超过 MySQL 用户的最大连接数,您需要确保 maximumpoolsize(在连接字符串中)设置为低于 max_user_connections 并且其他应用程序不会打开与同一用户帐户的连接,其总数可能超过上限。例如,鉴于我的上限为 15,我可以将我的设置为 5。

大多数托管服务都对此设置上限,以限制您正在使用的资源。

在单个连接中执行大量查询也可能是一种可行的解决方法。

此外,有时主机会限制 max_queries_per_hour 和其他此类变量。

关于c# - 具有许多异步插入的 MySQL 连接器池,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12919047/

相关文章:

c# - 枚举(estring)的字符串表示?

c# - ContinueWith TaskContinuationOptions.OnlyOnFaulted 似乎没有捕获到从启动的任务中抛出的异常

c# - 在 ViewModel 中使用 CollectionViewSource 的正确方法

c# - 如何在时间跨度内进行除法

c# - CefSharp WPF Web 浏览器未显示或呈现

c# - 使用多个连接字符串

c# - 如何告诉构造函数它应该只使用原始类型

wpf - 依赖属性如何保持值(value)

multithreading - 有没有办法限制任务并行库使用的线程?

c# - 实现返回 Task<T> 的方法的正确方法