文档章节

Spring对JDBC异常的封装

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 590
阅读 23
收藏 1

      Spring对JDBC异常的封装来自于《Expert One-on-One J2EE Design and Development》一书所持的观点。书中指明jdbc使用单一java.lang.SQLException异常表示数据访问时发生的所有异常是一个糟糕的设计。在JDBC API 4.0以前的版本中,异常处理功能极其有限。对于所有类型的错误都会笼统地抛出一个SQLException异常-根本不存在异常的详细分类,且没有相应的层次定义。所以这时,你唯一能够得到一些有意义的信息的办法是检索和分析SQLState值。另一方面,SQLState值及其相应的含义会因不同的数据源而有所改变;因此,要想追踪到问题的"根部"并且有效地处理异常是一件非常乏味的任务。对于早期版本jdbc异常处理方式的诟病逐渐成为了一种共识,在jdbc4.0规范中(即集成进jdk1.6的版本)对异常部分进行了大力度的改进,而这种改进与Spring对JDBC异常的封装是一致的。

      Spring认为针对数据访问中发生的不同情况设计相应的异常类型,并以一定的层次关系组织起来对于client是非常重要的,也是良好设计的一种体现。下面是Srping中一段典型的异常封装代码,我们可以从中看出,spring对于异常包装主要是通过分析从SQLException异常中得到的sqlErrorCodes,重新封装新异常。

// Next, look for grouped error codes.
    if (Arrays.binarySearch(this.sqlErrorCodes.getBadSqlGrammarCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new BadSqlGrammarException(task, sql, sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getInvalidResultSetAccessCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new InvalidResultSetAccessException(task, sql, sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getDuplicateKeyCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new DuplicateKeyException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getDataIntegrityViolationCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new DataIntegrityViolationException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getPermissionDeniedCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new PermissionDeniedDataAccessException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getDataAccessResourceFailureCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new DataAccessResourceFailureException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getTransientDataAccessResourceCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new TransientDataAccessResourceException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getCannotAcquireLockCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new CannotAcquireLockException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getDeadlockLoserCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new DeadlockLoserDataAccessException(buildMessage(task, sql, sqlEx), sqlEx);
    }
    else if (Arrays.binarySearch(this.sqlErrorCodes.getCannotSerializeTransactionCodes(), errorCode) >= 0) {
        logTranslation(task, sql, sqlEx, false);
        return new CannotSerializeTransactionException(buildMessage(task, sql, sqlEx), sqlEx);
    }

本文转载自:http://blog.csdn.net/bluishglc/article/details/6090153

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
说说 Spring DAO 的异常体系

Spring 提供了一套和实现技术无关的 、 面向 DAO 层语义级别的异常体系,内部通过转换器将不同持久化技术的异常转换成 Spring 的异常,实现统一管理。 1 异常体系 很多正统的 AP中,使用了过...

deniro
09/23
0
0
对JDBC的支持 之 7.1 概述

概述 JDBC回顾 传统应用程序开发中,进行JDBC编程是相当痛苦的,如下所示: //cn.javass.spring.chapter7. TraditionalJdbcTest @Test public void test() throws Exception { Connection co...

heroShane
2014/02/27
0
0
Spring JDBC最佳实践(1)

Spring提供了两种使用JDBC API的最佳实践,一种是以JdbcTemplate为核心的基于Template的JDBC的使用方式,另一种则是在JdbcTemplate基础之上的构建的基于操作对象的JDBC的使用方式。 基于Tem...

zuoer
2012/01/04
0
2
spring3.1.1的各个jar作用

最近开始深入学习spring了解到的一些spring知识分享给大家看看。 org.springframework.aop-3.1.1.RELEASE.jar ---- ----spring 的面向切面编程,提供AOP(面向切面编程)实现, org.springfr...

dml124
2012/07/13
0
2
Spring高级事务管理难点剖析

1Spring事务传播行为 所谓事务传播行为就是多个事务方法相互调用时,事务如何在这些方法间传播。Spring支持7种事务传播行为 PROPAGATION_REQUIRED(加入已有事务) 如果当前没有事务,就新建...

蛙牛
2014/08/23
0
12

没有更多内容

加载失败,请刷新页面

加载更多

Angularjs实现控制器之间通信方式示例

利用angularjs开发项目中,控制器之间的通信,比如参数的传递,数据的传递,都是比较常见的。控制器之间的通信,显得尤为重要。常见的方式有如下两种:一、angular服务的方式;二、基于事件广...

前端攻城老湿
5分钟前
0
0
xshell使用xftp传输文件

12月11日任务 15.4 xshell使用xftp传输文件 15.5 使用pure-ftpd搭建ftp服务 1.xshell使用xftp传输文件 示例一:xshell使用sftp传输文件 新建一个会话 定义为sftp 连接登入 可以get文件,下载...

hhpuppy
7分钟前
0
0
深入解析Vuex实战总结

这篇文章主要介绍了Vuex的初探与实战小结,写的十分的全面细致,具有一定的参考价值,对此有需要的朋友可以参考学习下。如有不足之处,欢迎批评指正。 1.背景 最近在做一个单页面的管理后台项...

前端攻城小牛
8分钟前
1
0
eslint rules 规则

'rules': { "comma-dangle": ["error", "never"], //是否允许对象中出现结尾逗号 "no-cond-assign": 2, //条件语句的条件中不允许出现赋值运算符 "no-console": 2, //不允许出现console语句 ...

agenyun
52分钟前
2
0
类型判断时instanceof和equals的不同用法

接口设计时为了避免序列化的麻烦,将接口定义为参数为map<String,String>类型的接口,但是现在调用时需要转换当前的实体Bean为Map,接口接收方再把Map转换为另一个Bean实体。过程中的需要对类...

wangtx
58分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部