为池中的每个连接设置MySql会话变量

时间:2020-01-30 12:30:13

标签: c# mysql .net-core

我正在使用mysqlconnector.net(https://github.com/mysql-net/MySqlConnector/)连接到MySql,并想为每个会话设置一些会话变量:SET SESSION wait_timeout = 60SET SESSION information_schema_stats_expiry = 15。我想始终设置这些会话变量,但是没有使用池连接时执行额外查询的开销(因为这是游戏服务器,吞吐量很重要)。用户无权设置全局变量。

我知道会话变量在MySqlConnection对象的生命周期内有效,并且如果使用ConnectionReset = false选项创建连接,则连接池时会话变量将继续存在。

问题:我不知道连接是真正创建的还是来自池的,因为同一个构造函数可以做到。我只想在新连接时设置会话变量。

我看到的一个解决方案是修改MySql连接库以添加一个API,该API可以告诉我连接对象是新创建的还是从池中获取的。

我将使用的解决方法是在使用Ansible创建数据库时设置全局变量-mysql_variables模块似乎可以满足我的需要(实际上,由于我使用的是AWS,因此必须是rds_param_group模块),但是此问题仍然有效,因为还有其他MySql用户无法控制他们正在使用的数据库。

1 个答案:

答案 0 :(得分:1)

https://github.com/mysql-net/MySqlConnector/issues/519中已经讨论了与您的请求类似的请求,其答案与this one类似:将事件处理程序附加到MySqlConnection.StateChange以设置会话变量。

如果您的性能需求使得您不会产生重置会话(ConnectionReset=true的默认行为)和每次设置会话变量的开销,那么实现自己的连接池可能很有意义。

通过在连接字符串中设置Pooling=false;,将绕过MySqlConnector的池,调用MySqlConnection.Open(Async)将立即打开一个新连接。您将必须保持连接打开而不是关闭/释放它(这可能会带来笨拙的编程模式),或者将其包装在IDisposable包装器中,然后将其返回到您的自定义池。