文档章节

Spring对JDBC异常的封装

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 590
阅读 22
收藏 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
海淀
程序员
对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 DAO 的异常体系

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

deniro
09/23
0
0
Spring JDBC最佳实践(1)

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

zuoer
2012/01/04
0
2
Spring高级事务管理难点剖析

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

蛙牛
2014/08/23
0
12
基于可靠消息方案的分布式事务(二):Java中的事务

前言:在上一篇文章 基于可靠消息方案的分布式事务:Lottor介绍 中介绍了常见的分布式事务的解决方案以及笔者基于可靠消息方案实现的分布式事务组件Lottor的原理,并展示了应用的控制台管理。...

aoho
06/01
0
0

没有更多内容

加载失败,请刷新页面

加载更多

centos7安装Nginx

安装所需环境 一. gcc 安装 安装 nginx 需要先将官网下载的源码进行编译,编译依赖 gcc 环境,如果没有 gcc 环境,则需要安装: yum install gcc-c++ 二. PCRE pcre-devel 安装 PCRE(Perl Co...

狼王黄师傅
15分钟前
0
0
dubbo+apollo微服务开发指南

为了大家比较快速的开发微服务,规范dubbo,spring,mybatis,hessian,netty的版本和用法,我写了一个demo,下面对demo的功能做个简单的介绍,如有疑问的地方,可以私下问我。 微服务项目示例 ...

PageYi
17分钟前
0
0
android流式布局、待办事项应用、贝塞尔曲线、MVP+Rxjava+Retrofit、艺术图片应用等源码

Android精选源码 android模仿淘宝首页效果源码 一款艺术图片应用,采用T-MVVM打造 Android MVP + RxJava + Retrofit项目 android流式布局实现热门标签效果 android仿淘宝客户端商品详情页效果...

Android爱开源
20分钟前
2
0
一步一步安装hive

The Apache Hive ™ data warehouse software facilitates reading, writing, and managing large datasets residing in distributed storage using SQL. Structure can be projected onto d......

hnairdb
23分钟前
1
0
【WebService 系列二 使用JAX-WS开发示例程序】

1、服务端代码 1.1、编写SEI SEI即(Service Endpoint Interface)SEI在ws中称为portType,在java中称为接口 package jaxws.server;/** * @className: HelloService * @description: jax......

HansonReal
32分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部