Java 如何判断何时存在连接数据库问题?
当数据库连接出现问题时,我需要进行特殊处理,例如数据库服务器关闭,而不是sql问题 在源代码中,我们可以得到各种异常,但哪些异常属于连接异常 如果出现这种问题,我们希望减少日志 已编辑 我有许多方法可以执行到数据库的连接,但都是从同一个方法(initSession)获取会话: 这里有一个例子:Java 如何判断何时存在连接数据库问题?,java,hibernate,exception,logging,Java,Hibernate,Exception,Logging,当数据库连接出现问题时,我需要进行特殊处理,例如数据库服务器关闭,而不是sql问题 在源代码中,我们可以得到各种异常,但哪些异常属于连接异常 如果出现这种问题,我们希望减少日志 已编辑 我有许多方法可以执行到数据库的连接,但都是从同一个方法(initSession)获取会话: 这里有一个例子: private Session initSession(HibernateUtil hibernateUtil) { Session oSession = null; tr
private Session initSession(HibernateUtil hibernateUtil) {
Session oSession = null;
try {
oSession = hibernateUtil.getSession();
} catch (Exception e) {
log.error("unable to log, Please check the details of your database");
}
return oSession;
}
public List findAlerts(int pFirstLine, int pNbElement) throws AnalyzerException {
List oAlerts = new ArrayList();
Session oSession = initSession(lHibernateUtil);
try {
oAlerts = AlertFinders.instance().findAlertByStatus(oSession, false, pFirstLine, pNbElement);
Iterator iterAlerts = oAlerts.iterator();
while (iterAlerts.hasNext()) {
...
}
} catch (UnableToLocateObjectException eU) {
throw new AnalyzerException(eU.getMessageSource(), eU.getClassNameSource(), eU.getMethodSource(), eU);
} finally {
oSession.close();
}
return oAlerts;
}
多种可能的方式
- 使用Java连接方法李>
- 使用连接池-所有主要连接 池支持此功能(包括c3p0和dbcp) throw SQLException具有getErrorCode()和getSQLState()方法
- 编写Java代码并经常轮询-下面是示例代码
如果您想将c3p0与Hibernate和Spring check link一起使用请查找上面的代码只是一个问题:在什么阶段我们可以检测到访问数据库的问题?当从SessionFactory获取会话时,当获取连接对象时..我们已经使用c3p0,空闲时间设置为5秒,testConnectionOnCheckout似乎只在hibernate 2.x上工作假设这个场景:我们有X个池连接,我的应用程序正在运行。但数据库突然崩溃了。会发生什么事每5秒将执行一次测试,但这是否意味着将删除所有X连接?如果数据库仍未恢复,我的应用程序将尝试创建新的连接,从而引发异常?
public class DbConnCheck {
public static void main(String[] args) throws Exception {
String url = args[0];
String username = args[1];
String password = args[2];
String driver = args[3];
Class.forName(driver);
Connection conn = DriverManager.getConnection(url, username, password);
try {
Statement statement = conn.createStatement();
ResultSet rs = statement.executeQuery("SELECT SYSDATE FROM DUAL");
while(rs.next()) {
System.out.println(rs.getObject(1));
}
} finally {
conn.close();
}
}
}