【发布时间】:2020-05-16 01:45:23
【问题描述】:
我正在使用 mysqlconnector.net (https://github.com/mysql-net/MySqlConnector/) 连接到 MySql,并希望为每个会话设置一些会话变量:SET SESSION wait_timeout = 60 和 SET SESSION information_schema_stats_expiry = 15。我想始终设置这些会话变量,但没有在使用池连接时执行额外查询的开销(因为它是游戏服务器并且吞吐量很重要)。用户无权设置全局变量。
我了解会话变量在 MySqlConnection 对象的生命周期内有效,如果连接是使用 ConnectionReset = false 选项创建的,那么会话变量将在连接池化时持续存在。
问题:我不知道连接是真正创建还是来自池,因为相同的构造函数可以做到。我想仅在新连接时设置会话变量。
我可以看到的一个解决方案是修改 MySql 连接库以添加一个 API,该 API 将告诉我连接对象是新创建的还是从池中获取的。
我将使用的解决方法是在使用 Ansible 创建数据库时设置全局变量——mysql_variables 模块似乎可以满足我的需要(实际上,因为我使用的是 AWS,所以它必须是rds_param_group 模块),但是这个问题仍然有效,因为还有其他 MySql 用户无法控制他们正在使用的数据库。
【问题讨论】:
-
我认为您的用例足够专业,您可能希望在连接字符串中使用
Pooling=false,并在 MySqlConnector 之上实现您自己的自定义连接池。 -
@BradleyGrainger 我很惊讶想要在没有额外性能成本的情况下设置系统变量是如此具体。但这是个好主意。我会考虑将其作为答案。