异常与数据库连接死锁
在我所接触的软件开发人员中,已经听到N多次数据库死锁的问题,说实在的,每次听到有人向他们报告数据库死锁的问题,我总是感到很诧异,始终怀疑他们的代码有问题。如果各种异常能得到合理的处理,会将死锁的可能性降到最低。
怎样合理地处理JDBC编程中的异常问题,好多权威的书籍也没有给出满意的答案。在2003年电子工业出版社出版的美国计算机宝典丛书《Java数据库编程宝典》一书中,在主要的章节,关闭数据库连接均在catch代码块中进行,直到最后的第24章多次出现令人质疑的同样的一段代码
/** * 终结守卫者,最后一道安全屏障,关闭联接。开发人员不应依赖此方法来关闭联接,但以下情况发生后,可能造成数据库连接不能关闭,因此有必要保留终结守卫者模式。长期的实践证明,终结守卫者能起到良好的作用。<br/> * 1、网络连接终止;<br/> 2、应用程序中发生非SQLException异常后,可能导致数据库连接没有关闭。<br/> */ private final Object _finalizerGuardian = new Object() { @Override protected void finalize() throws SQLException, Throwable { if (con != null && !con.isClosed()) { try { super.finalize(); } finally { if (!autoCommit) { if (failCommit) { try { if (savepoint == null) { con.rollback(); } else { con.rollback(savepoint); } System.out.println("[" + dt.dateTime() + "] Connection rollback in finalize."); } catch (SQLException ex) { Logger.getLogger(ProcessVO.class.getName()).log(Level.SEVERE, ex.getMessage(), ex); } finally { con.close(); autoCommit = true; System.out.println("[" + dt.dateTime() + "] Connection is not autocommit, rollback and then closed in finalize."); } } else { con.close(); System.out.println("[" + dt.dateTime() + "] Connection is autocommit, closed in finalize,You should close it."); } } else { con.close(); System.out.println("[" + dt.dateTime() + "] Connection closed in finalize,You should close it."); } } } } };