Spring学习(十二)-Spring对DAO的支持

统一的异常体系

统一的异常体系是整合不同的持久化实现技术(Hibernate、iBatis、JPA、JDO)的关键,Spring提供了一套和实现技术无关、面向DAO层语义的异常体系,并通过转换器将不同持久化技术的异常转换成Spirng的异常。

Spring的DAO异常体系

在很多传统的API或框架中,检查型异常被过多的使用,以至于使用API时,代码里面充满了try/catch样板式的代码。很多情况下,除了在try/catch中记录异常信息以外,我们并没有做多少实质性工作,强制捕获检查型异常除了限制开发人员的自由度之外,并没有提供什么有价值的东西。因此,Spring的异常体系都是建立在运行期异常的基础上,开发者可以根据需要捕获感兴趣的异常。
JDK很多API之所以难用,一个很大的原因就是检查型异常的泛滥,如JavaMail、EJB以及JDBC等,使用这些API,一堆异常处理的代码都侵入业务代码中,破坏了代码的整洁和优雅。
SpringDAO异常体系类非常丰富,了解一下DataAccessException异常类下的子类。

  • CleanupFailureDataAccessException:DAO操作成功执行,但在释放数据资源时发生异常,如关闭Connection时发生异常等。
  • ConcurrencyFailureException:表示在运行并发数据操作时发生异常,如乐观锁无法获取、悲观锁无法获取、死锁引发的失败等异常。
  • DataAccessResoureFailureException:访问数据资源时失败,如无法获取数据连接,无法获取Hibernate的会话等。
  • DataRetrievalFailureException:获取数据失败,如找不到对应主键的数据,使用了错误的索引等
  • DataSourceLookupFailureException:无法从JNDI中查找到数据源。
  • DataIntergrityViolationException:当数据操作违反了数据一致性限制时抛出的异常,如插入重复的主键,引用不存在的外键等。
  • InvalidDataAccessApiUsageException:不正确地调用某一持久化技术时抛出的异常,如在Spirng JDBC中查询对象在调用前必须进行编译操作,如果忘了这项操作将会产生该异常。这种异常不是由底层数据资源产生,而是由不正确地使用持久化技术产生的。
  • InvalidDataAccessResoureUsageException:在访问数据源时使用了不正确的方法所抛出的异常,如SQL语句错误将抛出该异常。
  • PermissionDeniedDataAccessException:数据访问时由于权限不足引发的异常,如仅拥有只读权限的用户视图进行数据更改操作时将抛出该异常。
  • UncategorizedDataAccessException:其他未分类的异常都归到该异常中。

数据源

DBCP数据源
DBCP是一个依赖commons-pools对象池机制的数据库连接池,所以在类路径下还必须包括commons-pools的类包。下面是使用DBCP配置Mysql数据源的代码:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
		destroy-method="close"
		p:driverClassName="com.mysql.jdbc.Driver"
		p:url="jdbc:mysql://localhost:3306/xxdb?characterEncoding=utf8&amp;useSSL=false"
		p:username="root"
		p:password="123"/>

BasicDataSource提供了close()方法关闭数据源,所以必须设定destroy-method="close"属性,以便Spring容器关闭时,数据源能够正常关闭。如果采用DBCP的默认配置,由于testOnBorrow属性的默认值为true,数据源在将连接交给DAO之前,会事先检测这个连接是否是好的,如果连接有问题(在数据库端被关闭),则会取一个其他的连接给DAO。所以,并不会有“8小时问题”。如果每次将连接交给DAO时都检测连接有效性,在高并发的应用中将会带来性能的问题,因为它会需要更多的数据库访问请求。
C3P0数据源

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
		destroy-method="close"
		p:driverClassName="oracle.jdbc.driver.OracleDriver"
		p:jdbcUrl="jdbc:oracle:thin:@localhost:1521:ora9i"
		p:username="admin"
		p:password="123"/>

BasicDataSource和ComboPooledDataSource一样提供了一个用于关闭数据源的close()方法,这样我们就可以保证Spring容器关闭时数据源能够成功释放。

Spring将数据访问流程划分为固定部分和变化部分,并以模板的方式定义好流程,用回调接口将变化的部分开放出来,留给开发者自行定义。这样,我们仅需要提供业务相关的逻辑就可以完成整体的数据访问了。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值