【问题标题】:Setting a MySql session variable for every single connection in a pool为池中的每个连接设置一个 MySql 会话变量
【发布时间】:2020-05-16 01:45:23
【问题描述】:

我正在使用 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 用户无法控制他们正在使用的数据库。

【问题讨论】:

  • 我认为您的用例足够专业,您可能希望在连接字符串中使用Pooling=false,并在 MySqlConnector 之上实现您自己的自定义连接池。
  • @BradleyGrainger 我很惊讶想要在没有额外性能成本的情况下设置系统变量是如此具体。但这是个好主意。我会考虑将其作为答案。

标签: c# mysql .net-core


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-13
    • 2021-11-16
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2023-02-01
    相关资源
    最近更新 更多