当数据库Mysql崩溃时,我如何在java中知道
我正在使用J2EE和Mysql数据库,并使用JDBC建立连接。我想知道数据库何时崩溃以及如何处理它。检查数据库的唯一方法是查看连接是否成功建立吗?还是有别的办法 你不能也不应该知道。就您的程序而言,要么一切正常,要么无法连接当数据库Mysql崩溃时,我如何在java中知道,java,mysql,jdbc,error-handling,Java,Mysql,Jdbc,Error Handling,我正在使用J2EE和Mysql数据库,并使用JDBC建立连接。我想知道数据库何时崩溃以及如何处理它。检查数据库的唯一方法是查看连接是否成功建立吗?还是有别的办法 你不能也不应该知道。就您的程序而言,要么一切正常,要么无法连接 如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您需要某种形式的监控,以便有人知道数据库有什么问题,但这不是您的程序的责任。您不能也不需要知道。就您的程序而言,要么一切正常,要么无法连接 如果无法获得连接,程序必须正确运行,这
如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您需要某种形式的监控,以便有人知道数据库有什么问题,但这不是您的程序的责任。您不能也不需要知道。就您的程序而言,要么一切正常,要么无法连接
如果无法获得连接,程序必须正确运行,这在大多数情况下可能涉及某种形式的错误显示和停止操作。当然,您希望进行某种形式的监视,以便有人知道数据库有什么问题,但这不是您的程序的责任。实际上,数据库中有许多可能出错的情况,可能会导致崩溃、重大故障或部分故障。一个表可能会被管理员删除,您可能会耗尽空间,等等。这些可能允许您获得连接,也可能不允许 可能很难区分什么是主要故障(数据库关闭)和什么是允许系统继续运行的部分故障 显然,如果您不能连接到数据库,那么您的应用程序就不能做很多事情。这可能表示数据库已“崩溃”,但如果您的数据库位于另一台服务器上,也可能是网络问题。这并不重要 我开发的大多数应用程序在检查重大故障方面做得不多。但有一些策略可能会有所帮助:
实际上,数据库中有很多可能出错的事情,可能会导致崩溃、重大故障或部分故障。一个表可能会被管理员删除,您可能会耗尽空间,等等。这些可能允许您获得连接,也可能不允许 可能很难区分什么是主要故障(数据库关闭)和什么是允许系统继续运行的部分故障 显然,如果您不能连接到数据库,那么您的应用程序就不能做很多事情。这可能表示数据库已“崩溃”,但如果您的数据库位于另一台服务器上,也可能是网络问题。这并不重要 我开发的大多数应用程序在检查重大故障方面做得不多。但有一些策略可能会有所帮助:
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:重试和/或故障切换
另一种选择是进行固定次数的重试和/或故障切换到备份数据库。故障切换到备份数据库可能很棘手