我的ASP.NET应用程序中是否有一种简单的方法可以通过编程方式找出mysql数据库服务器是否已关闭?

时间:2009-03-26 00:20:18

标签: .net asp.net mysql

我在我的ASP.NET应用程序中使用MySQL(使用MySQL .NET Connector),无论如何都要以编程方式检查数据库服务器是否已关闭?我遇到了MySQLConnection.Ping(),但遗憾的是它不能正常工作(必须首先使用Open()打开连接,即使数据库服务器再次可用,它也会继续返回false)。我想出的唯一解决方案是使用Open()方法,如果抛出异常然后数据库服务器不可用,是否有更可靠的方法来执行此操作?我在某处读到如果使用连接池,使用Open()可能无法按预期工作,这可能导致即使数据库服务器启动也会抛出异常。

如果您需要详细信息,请阅读:

在我的应用程序中,我记录所有异常(首先我尝试将它们记录到数据库服务器 - 可能是相同的数据库服务器,但可能不是,取决于配置 - 如果失败,则将异常记录到文本文件)。现在我想处理这个案例,如果数据库服务器关闭了,通常会发生的事情就是几乎每次请求都会抛出异常,这意味着日志将满了这些异常,另一个问题是我将继续向用户提供错误页面(或者换句话说,用户将继续看到他们对应用程序发出的每个请求的错误页面),我想要做的是如果抛出数据库异常(即类型MySQLException)检查数据库服务器是否已启动,如果没有则更改我的应用程序中的某个标志并提供包含应用程序暂时不可用的页面(该标志在httpModule中检查并重定向或传输到该页面) 。我还计划让它使用短信代理向我发送短信,以便我可以采取行动,但这是另一个故事并且与此问题无关。

4 个答案:

答案 0 :(得分:2)

try {
    cmd.ExecuteNonQuery();
    // server is up
}
catch { 
    // server is down
}

答案 1 :(得分:0)

我喜欢这个解决方案.. http://forums.asp.net/p/1066040/1542583.aspx

  

我的解决方案是拥有两个   连接。一个非常短   我用于测试的超时,和   另一个正常。我先做一个   虚拟召唤短时间出一个。   如果失败了,我会展示一些东西   那不是来自数据库,   否则,我正常进行。那   用户没有看到错误的方式   页。

诀窍是确保超时处于“快乐”范围内。在一个体面的环境中应该做几秒钟。

答案 2 :(得分:0)

我见过这样的解决方案(技术上我们用C#连接到SQL Server数据库,但是简单地使用了MySQL连接器,我相信它们的工作方式基本相同)我们所拥有的是单个创建和打开连接的位置。在那个方法中,我们将SQLException(MySQLException)包装在特殊的“hey the database be borked”异常中。然后在异常处理程序/记录器中,您可以检查您的特殊异常,并在数据库关闭时执行您需要执行的操作。

这里的想法是不必编写一堆额外的代码来检查以确保数据库在那里并在您进行每次调用之前正常工作,但是为了确保在发生错误时您知道数据库是罪魁祸首,可以妥善处理。

答案 3 :(得分:0)

也许您可以尝试连接原始TcpClient,即。只是尝试连接并断开连接。虽然这不能解决抛出异常的问题。

try{
 TcpClient _socket = new TcpClient();
 _socket.Connect(host, port);
 _socket.Close();
}
catch (System.Net.Sockets.SocketException ex)
{
    if (ex.SocketErrorCode == System.Net.Sockets.SocketError.ConnectionRefused //Process down
        || ex.SocketErrorCode == System.Net.Sockets.SocketError.HostDown //Server turned off
        || ex.SocketErrorCode == System.Net.Sockets.SocketError.TimedOut //Not responding
       )
    {
      //=> offline mode
    }
}