Spring对JDBC异常的封装

标签: spring jdbc 异常 | 发表时间:2013-11-18 12:52 | 作者:呆呆DE萌萌
出处:http://www.iteye.com

      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);  
    }  

 



已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [spring jdbc 异常] 推荐:

Spring对JDBC异常的封装

- - 编程语言 - ITeye博客
      Spring对JDBC异常的封装来自于《Expert One-on-One J2EE Design and Development》一书所持的观点. 书中指明jdbc使用单一java.lang.SQLException异常表示数据访问时发生的所有异常是一 个糟糕的设计. 在JDBC API 4.0以前的版本中,异常处理功能极其有限.

spring与jdbc的结合使用

- - CSDN博客推荐文章
利用spring可以解决事务处理时的许多问题,同spring实现其他的功能相似,spring提供了两种不同的方式实现与jdbc的结合,两种方式是注解和xml配置方式. 1.   spring和jdbc的结合. 1)       建立PersonService接口:. * 得到所有的Person. 2)       编写接口的实现类,并且将该bean纳入到spring的事务管理中(通过注解方式):.

配置Spring JDBC的事务回滚失效

- - CSDN博客推荐文章
今天配置Mysql DBCP连接池事务回滚失效,竟然浪费了我一下午的时间去调研,问了好多人也都没发现,最后还得靠自己,总结问题如下:. 1、Mysql数据库用的是MyISAM表结构而非InnerDB(浪费了两个小时). 2、网上说的默认情况下,一个有事务方法, 遇到RuntiomeException 时会回滚.

Spring Boot 2 整合 shard-jdbc 中间件,实现数据分库分表

- - IT瘾-dev
以字段为依据,按照一定策略,将一个库中的数据拆分到多个库中. 每个库的结构都一样;数据都不一样;. 所有库的并集是全量数据;. 以字段为依据,按照一定策略,将一个表中的数据拆分到多个表中. 每个表的结构都一样;数据都不一样;. 所有表的并集是全量数据;. 二、Shard-jdbc 中间件. 1)、Sharding-JDBC直接封装JDBC API,旧代码迁移成本几乎为零.

spring mvc 异常处理(转)

- - 编程语言 - ITeye博客
链接:http://gaojiewyh.iteye.com/blog/1297746 (附源码). 链接:http://zywang.iteye.com/blog/983801 . 链接:http://www.cnblogs.com/xguo/p/3163519.html . 链接:http://fuliang.iteye.com/blog/947191 .

HA-JDBC -

- -
The state manager component is responsible for storing the active status of each database in the cluster, as well as any durability state.

裴东辉-Spring集成HikariCP(另外一款高性能的 JDBC 连接池) - 裴东辉

- - 博客园_首页
HikariCP简介( http://brettwooldridge.github.io/HikariCP/):. 一、项目整体布局(为了区分HikariCP依赖的jar包,jar包都以Hikari-1.3.8-为前缀). 二、测试的类,HikariCPSpring.java. 三、日志打印文件,log4j.properties.

使用Spring跟踪应用异常(1)

- - ImportNew
几周以前,一个同事请我帮他一周的忙. 他想要享受一个难得的假期,但是找不到其他人帮他. 由于我刚完成一个特别复杂的编码工作,需要来点自我调节,所以就答应了他的请求. 那份工作的一部分是监控一些非常关键的后台运行进程,观察它们是否运行正常. 开发者花了很多时间和精力在应用中加入日志输出,以此表明应用正常运行.

Spring Boot异常处理详解

- - ImportNew
在《 Spring MVC异常处理详解 》中,介绍了Spring MVC的异常处理体系,本文将讲解在此基础上Spring Boot为我们做了哪些工作. 下图列出了Spring Boot中跟MVC异常处理相关的类. Spring Boot在启动过程中会根据当前环境进行AutoConfiguration,其中跟MVC错误处理相关的配置内容,在ErrorMvcAutoConfiguration这个类中.

Spring Boot + WebSocket 实时监控异常

- - 掘金 后端
原文:cnblogs.com/jae-tech/p/15409340.html. 此异常非彼异常,标题所说的异常是业务上的异常. 最近做了一个需求,消防的设备巡检,如果巡检发现异常,通过手机端提交,后台的实时监控页面实时获取到该设备的信息及位置,然后安排员工去处理. 因为需要服务端主动向客户端发送消息,所以很容易的就想到了用WebSocket来实现这一功能.