例外连接延迟打开软件

时间:2015-09-12 09:27:45

标签: c# wpf

我在处理与数据库的连接时遇到了一些问题。我本质上做的是创建一个名为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分钟到达的例外情况! 我做错了什么?

1 个答案:

答案 0 :(得分:0)

由于许多因素,建立与数据库服务器的连接可能需要相当长的时间:网络条件,服务器负载,身份验证开销等。因此,驱动程序(MySqlConnection后面的代码)需要等待适当的数量是时候决定是否可以建立连接。显然,在您的情况下,默认超时是60秒(或者由于多个请求而导致默认的15秒,因为文档的默认值为15秒。)。

您可以做的是通过连接字符串中的ConnectionTimeout参数降低超时 - 请参阅此处的documentation。但是,请记住,通过将其设置为5秒,您的程序可能会在合法情况下失败,否则它将成功连接到服务器。我建议您执行数据库操作或至少异步进行初始检查,同时显示“请稍候”消息。