Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为池中的每个连接设置MySql会话变量_C#_Mysql_.net Core - Fatal编程技术网

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

C# 为池中的每个连接设置MySql会话变量,c#,mysql,.net-core,C#,Mysql,.net Core,我正在使用mysqlconnector.net连接到MySql,并希望为每个会话设置一些会话变量:设置会话等待\超时=60,设置会话信息\模式\统计\到期=15。我希望总是设置这些会话变量,但在使用池连接时,不会有执行额外查询的开销,因为它是一个游戏服务器,吞吐量很重要。用户没有设置全局变量的权限 我知道会话变量在MySqlConnection对象的生存期内有效,如果使用ConnectionReset=false选项创建连接,那么当连接被池化时,会话变量将持续存在 问题是:我不知道连接是真正创建

我正在使用mysqlconnector.net连接到MySql,并希望为每个会话设置一些会话变量:设置会话等待\超时=60,设置会话信息\模式\统计\到期=15。我希望总是设置这些会话变量,但在使用池连接时,不会有执行额外查询的开销,因为它是一个游戏服务器,吞吐量很重要。用户没有设置全局变量的权限

我知道会话变量在MySqlConnection对象的生存期内有效,如果使用ConnectionReset=false选项创建连接,那么当连接被池化时,会话变量将持续存在

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

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


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

上已经讨论了一个类似于您的请求,答案类似于:将事件处理程序附加到MySqlConnection.StateChange以设置会话变量

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


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

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