当数据库Mysql崩溃时,我如何在java中知道

当数据库Mysql崩溃时,我如何在java中知道,java,mysql,jdbc,error-handling,Java,Mysql,Jdbc,Error Handling,我正在使用J2EE和Mysql数据库,并使用JDBC建立连接。我想知道数据库何时崩溃以及如何处理它。检查数据库的唯一方法是查看连接是否成功建立吗?还是有别的办法 你不能也不应该知道。就您的程序而言,要么一切正常,要么无法连接 如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您需要某种形式的监控,以便有人知道数据库有什么问题,但这不是您的程序的责任。您不能也不需要知道。就您的程序而言,要么一切正常,要么无法连接 如果无法获得连接,程序必须正确运行,这

我正在使用J2EE和Mysql数据库,并使用JDBC建立连接。我想知道数据库何时崩溃以及如何处理它。检查数据库的唯一方法是查看连接是否成功建立吗?还是有别的办法

你不能也不应该知道。就您的程序而言,要么一切正常,要么无法连接


如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您需要某种形式的监控,以便有人知道数据库有什么问题,但这不是您的程序的责任。

您不能也不需要知道。就您的程序而言,要么一切正常,要么无法连接


如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您希望进行某种形式的监视,以便有人知道数据库有什么问题,但这不是您的程序的责任。

实际上,数据库中有许多可能出错的情况,可能会导致崩溃、重大故障或部分故障。一个表可能会被管理员删除,您可能会耗尽空间,等等。这些可能允许您获得连接,也可能不允许

可能很难区分什么是主要故障(数据库关闭)和什么是允许系统继续运行的部分故障

显然,如果您不能连接到数据库,那么您的应用程序就不能做很多事情。这可能表示数据库已“崩溃”,但如果您的数据库位于另一台服务器上,也可能是网络问题。这并不重要

我开发的大多数应用程序在检查重大故障方面做得不多。但有一些策略可能会有所帮助:

  • 进行一些“健全性检查”(例如,查询已知表)。如果健全性检查失败,您将面临严重问题
  • 有一个错误计数。如果在给定的时间内发生了超过一定数量的错误,您就有一个严重的问题

  • 实际上,数据库中有很多可能出错的事情,可能会导致崩溃、重大故障或部分故障。一个表可能会被管理员删除,您可能会耗尽空间,等等。这些可能允许您获得连接,也可能不允许

    可能很难区分什么是主要故障(数据库关闭)和什么是允许系统继续运行的部分故障

    显然,如果您不能连接到数据库,那么您的应用程序就不能做很多事情。这可能表示数据库已“崩溃”,但如果您的数据库位于另一台服务器上,也可能是网络问题。这并不重要

    我开发的大多数应用程序在检查重大故障方面做得不多。但有一些策略可能会有所帮助:

  • 进行一些“健全性检查”(例如,查询已知表)。如果健全性检查失败,您将面临严重问题
  • 有一个错误计数。如果在给定的时间内发生了超过一定数量的错误,您就有一个严重的问题
  • 当我的数据库崩溃时,我如何在Java代码中知道

    从JDBC4.1(JavaSE7)开始,有一种方法可以使JDBC操作停止执行,并在它们花费的时间超过您设置的超时时间时抛出SQLException

    要使用此机制,请将网络超时设置为毫秒数,您希望这是等待DB回复的最长时间。如果任何操作花费的时间超过您设置的超时时间,它将停止等待,并且该方法将抛出SQLException

    如何使用setNetworkTimeout的示例:

    Connection conn = // get your connection however
    
    conn.setNetworkTimeout(Executors.newSingleThreadExecutor(),
                           10 * 1000); // 10s timeout
    
    Statement stmt = conn.createStatement();
    
    // suppose DB crashes at this point in time
    
    try {
        stmt.execute("SOME SQL HERE");
    } catch (SQLException sqle) {
        // could be from network timeout,
        // but could also be caused by something else
        // You can check what your JDBC driver does
    }
    
    正如您在本例中看到的,网络超时只抛出SQLException这一事实使得该机制更难使用。我真希望JDBC4.1的架构师决定抛出
    SQLException
    的一些子类,这样就有了一种可移植的方法来判断何时发生网络超时。像
    SQLNetworkTimeoutException
    这样的东西作为
    SQLException
    的子类会很好

    在任何情况下,检查
    SQLException
    是否是由网络超时引起的最好方法是检查
    SQLException
    上的消息字符串,但要小心一点,因为不同的JDBC驱动程序将有不同的网络超时消息


    除了网络超时之外,您可以尝试的另一件事是检查
    sqlnontransienceexception
    。通常,当出现某种灾难性数据库故障时,会发生的异常是
    sqlnontransienceexception
    ,它是
    SQLException
    的子类

    本质上,这个异常意味着“出现了超出代码或JDBC驱动程序控制范围的错误”。所以一般来说,当你看到这一点,这是因为一个数据库故障或网络故障

    一旦我知道出了问题,如何处理DB故障

    这一部分有点棘手,特别是因为DB可能会出现很多问题(可能会崩溃,网络可能会停机/变慢等等)

    选项A:表明出现了问题
    在我见过的大多数情况下,“处理”此类故障的方法是承认它并将其呈现给用户

    选项B:重试和/或故障切换
    另一种选择是进行固定次数的重试和/或故障切换到备份数据库。故障切换到备份数据库可能很棘手