我在处理与数据库的连接时遇到了一些问题。我本质上做的是创建一个名为Database
的类,在此我放置了连接数据库所需的所有方法,检查连接是否处于活动状态,并根据连接状态更新控件。这很有效,控制更新并且没有问题,但是当您的计算机上没有连接时,程序会延迟打开,因为它们会产生一系列例外,特别是:
MySql.Data.MySqlClient.MySqlException(0x80004005)
方法isAvailable()
中发生异常,此方法检查连接是否可用,如果分别存在,则返回true;如果不存在,则返回false。
public static bool isAvailable()
{
try
{
string connStr = @"Server=xxx;Port=xxx;Database=xxx;Uid=xxx;Pwd=xxx;";
connection = new MySqlConnection(connStr);
connection.Open();
return true;
}catch(Exception ex)
{
connection.Close();
Console.WriteLine(ex.ToString());
return false;
}
}
此方法由包含以下内容的checkStatus调用:
public static void checkStatus()
{
if(isAvailable() == false)
{
updateStatus("false");
}
else
{
updateStatus("true");
}
}
检查它是真还是假并分别返回到后面将值传递给另一个方法,该方法只是在界面中显示一个警告画布红色或绿色...
在我的其他类的每个方面调用checkStatus
来检查连接状态(在执行查询之前,几乎结构如下):
string stm = "SELECT * FROM history";
MySqlCommand cmd = new MySqlCommand(stm, Database.Database.Connection);
Database.Database.checkStatus(); //here
MySqlDataReader rdr = cmd.ExecuteReader();
在类构造函数中调用方法isAvailable Database来检查连接是否实际打开。
此时我不明白为什么管理程序时的异常会在用户执行时延迟外观。如果启动时没有异常发生,则程序启动大约需要5秒钟,而除了我在1分钟到达的例外情况!
我做错了什么?
答案 0 :(得分:0)
由于许多因素,建立与数据库服务器的连接可能需要相当长的时间:网络条件,服务器负载,身份验证开销等。因此,驱动程序(MySqlConnection
后面的代码)需要等待适当的数量是时候决定是否可以建立连接。显然,在您的情况下,默认超时是60秒(或者由于多个请求而导致默认的15秒,因为文档的默认值为15秒。)。
您可以做的是通过连接字符串中的ConnectionTimeout
参数降低超时 - 请参阅此处的documentation。但是,请记住,通过将其设置为5秒,您的程序可能会在合法情况下失败,否则它将成功连接到服务器。我建议您执行数据库操作或至少异步进行初始检查,同时显示“请稍候”消息。