我有一个使用MySql数据库的ac#应用程序,一段时间不活动(8小时)或连接到数据库是主机的服务器丢失后,与数据库的连接关闭,数据库查询无法解决被执行。如何启用自动重新连接到数据库。
最好的问候。
答案 0 :(得分:2)
我认为首先应该解决的问题是,为什么连接会连续开放8小时?
我认为在大多数情况下,您将连接到数据库,执行您的操作并关闭它:
using (var conn = new MySqlConnection(connString))
{
// do what you need here
}
using块将创建一个仅在块内有效的连接。当块结束时,将在连接上调用Dispose方法并关闭并正确处理连接对象。这将阻止您的应用程序在不需要时使用可用连接。
如果您 ,您需要确定连接是否已打开,那么您的连接变量将具有State
属性,该属性将是ConnectionState枚举。
您可以使用以下内容进行检查:
if (conn.State != ConnectionState.Open)
{
conn = new MySqlConnection(connString);
}
希望有所帮助。
答案 1 :(得分:1)
在您的应用程序中,在任何查询之前,请测试您的连接是否仍处于活动状态。如果不是,则重新连接。瞧瞧!
答案 2 :(得分:0)
如果尝试访问数据库失败,请再次运行连接命令。
答案 3 :(得分:0)
您可以在连接字符串中使用选项keepalive
和keepalivetimeout
。最好使用MySqlConnectionStringBuilder
。
答案 4 :(得分:0)
感谢您的回答和建议。我有这个要求,因为持久性被委托给非托管代码,而在我的C#代码中,我只调用这个API。
我通过将具有28800秒(8小时)的wait_timeout
MySQL参数更改为不活动时段的默认值来解决了我的问题。
答案 5 :(得分:0)
while (conn.State != ConnectionState.Open)
{
sleep(1); // sleep 1 second, depends what function u use here if using timer namespace mightt need differnt function. this type of code is good for cloud type dbs like godaddy/1&1/amazon cloud. where connection can be asummed unreliable due too heavy cloud lag.
conn = new MySqlConnection(connString);
}
替代方案可以是:
int counter = 0;
int NUM_RETRIES = 10;
while (conn.State != ConnectionState.Open && counter < NUM_RETRIES)
{
System.Threading.Thread.Sleep(1000);//sleep(1); // sleep 1 second ( if webservice better to sleep for 50-100 ms), depends what function u use here if using timer namespace mightt need differnt function. this type of code is good for cloud type dbs like godaddy/1&1/amazon cloud. where connection can be asummed unreliable due too heavy cloud lag.
conn = new MySqlConnection(connString);
counter++;
}
也是这个。 https://dev.mysql.com/doc/refman/5.7/en/auto-reconnect.html