您的位置:首页 > 编程语言 > Java开发

传智播客-spring2.5(4)-JDBC与事务

2011-04-08 11:37 260 查看
spring里集成JDBC
(ms很多框架的很多应用,包括事务,现在都提供注解方式和基于xml配置方式,现在的趋势是采用注释方式,极大的改进了开发效率)
使用Spring集成JDBC的步骤如下:
1、配置数据源,如:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="org.gjt.mm.mysql.Driver"/>
<property name="url" value="jdbc:mysql://localhost:3306/itcast?useUnicode=true&characterEncoding=UTF-8"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<!-- 连接池启动时的初始值 -->
<property name="initialSize" value="1"/>
<!-- 连接池的最大值 -->
<property name="maxActive" value="500"/>
<!-- 最大空闲值.当经过一个高峰时间后,连接池可以慢慢将已经用不到的连接慢慢释放一部分,一直减少到maxIdle为止 -->
<property name="maxIdle" value="2"/>
<!-- 最小空闲值.当空闲的连接数少于阀值时,连接池就会预申请一些连接,以避免洪峰来时再申请而造成的性能开销 -->
<property name="minIdle" value="1"/>
。。。(略)
</bean>
上面使用了Apache组织的dbcp数据源,我们需要把lib/jakarta-commons下的commons-dbcp.jar和commons-pool.jar加入类路径下。

还可以使用属性占位符方式配置数据源:<context:property-placeholder location="jdbc.properties"/>,其中“jdbc.properties”为类路径下的属性文件,然后获取连接信息时用表达式取值,例如:<property name="driverClassName" value="${driverClassName}"/>,其中${driverClassName}为属性文件中的key值。

2、配置事务。配置事务时,需要在xml配置文件中引入用于声明事务的tx命名空间,如下:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd"> (略)
</beans>

spring配置事务可以用注解或xml配置文件方式,但两者都需要声明spring的事务管理,如下:
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>

具体示例就不写了。

对于传统的JDBC编程,至少有两个弊端:一是繁琐的连接关闭和事务处理代码,而忘记关闭通常是很多问题的源头;二是JDBC不提供一个异常层次,而是用抛出SQLException来响应所有错误,当出错要具体排查时不够方便--要找到诸如是死锁还是非法的SQL问题需要检查SQLState的值和错误码,而这些值随着数据库的不同而不同。

而spring的解决方案是:一、将那些繁琐的代码封装到框架中,而我们开发时就可以集中精力在编写恰当的SQL和提取结果上;二、spring自定义的一套有层次的异常处理,而且这些异常并不是JDBC所特有的(关于spring与jdbc更多的知识请参见满江红译文《SpringFramework概述》)。

关于JDBC入门到详解的知识可以下载传智播客的网上免费视频JDBC课程:)

理解spring里的事务
1、通过一个类似JDBCTemplate的回调模板(例如org.springframework.jdbc.core包下的JdbcTemplate类,自带有CRUD操作方法)来实现可编程的事务管理。

2、spring里可以采用@Transactional注解方式声明事务,而其事务传播属性有以下几种:
(1)REQUIRED:业务方法需要在一个事务中运行。如果方法运行时,已经处在一个事务中,那么加入到该事务,否则为自己创建一个新的事务。
(2)NOT_SUPPORTED:声明方法不需要事务。如果方法没有关联到一个事务,容器不会为它开启事务。如果方法在一个事务中被调用,该事务会被挂起,在方法调用结束后,原先的事务便会恢复执行。
(3)REQUIRESNEW:属性表明不管是否存在事务,业务方法总会为自己发起一个新的事务。如果方法已经运行在一个事务中,则原有事务会被挂起,新的事务会被创建,直到方法执行结束,新事务才算结束,原先的事务才会恢复执行。
(4)MANDATORY:该属性指定业务方法只能在一个已经存在的事务中执行,业务方法不能发起自己的事务。如果业务方法在没有事务的环境下调用,容器就会抛出例外。
(5)SUPPORTS:这一事务属性表明,如果业务方法在某个事务范围内被调用,则方法成为该事务的一部分。如果业务方法在事务范围外被调用,则方法在没有事务的环境下执行。
(6)NEVER:指定业务方法绝对不能在事务范围内执行。如果业务方法在某个事务中执行,容器会抛出例外,只有业务方法没有关联到任何事务,才能正常执行。
(7)NESTED:如果一个活动的事务存在,则运行在一个嵌套的事务中. 如果没有活动事务, 则按REQUIRED属性执行.它使用了一个单独的事务, 这个事务拥有多个可以回滚的保存点。内部事务的回滚不会对外部事务造成影响。它只对DataSourceTransactionManager事务管理器起效。
spring的事务管理借鉴了ejb的事务管理方式,上述几种传播方式中前六种ejb也有,最后一种则是spring独有的。

3、默认情况下,spring不对抛出Checked Exception(例如在方法上显示声明抛出的Exception)的事务回滚,只对unChecked Exception回滚,但是可以用@Transactional(RollbackFor)更改。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: