首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

错误与数据库连接死锁

2013-03-17 
异常与数据库连接死锁在我所接触的软件开发人员中,已经听到N多次数据库死锁的问题,说实在的,每次听到有人

异常与数据库连接死锁
        在我所接触的软件开发人员中,已经听到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.");                    }                }            }        }    };


        以上这些代码,能共同保证在发生SQLException的前提下,如果打开了事务,确保事务回滚,在关闭会话前关闭事务。
        在JadePool发布前,有关异常与事务的提交、回滚之间的关联做了大量的测试,能确保JadePool的核心类ProcessVO是健壮的、可靠的。
        在此,欢迎提出宝贵意见,帮助我更好的完善JadePool开源项目;更希望有实力的Java工作者参与。


热点排行