浏览 7123 次
锁定老帖子 主题:Spring声明式事务学习
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2007-02-13
dataAccessContext-jta.xml <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.0.xsd"> <jee:jndi-lookup id="DataSource" jndi-name="java:comp/env/jdbc/DataSource"/> <jee:jndi-lookup id="DataSource2" jndi-name="java:comp/env/jdbc/DataSource2"/> <bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"/> <bean id="UserDao" class="dao.UserDaoImpl"> <property name="ds" ref="DataSource"/> <property name="ds2" ref="DataSource2"/> </bean> </beans> applicationContext.xml <?xml version="1.0" encoding="UTF-8"?> <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:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"> <aop:config> <aop:advisor pointcut="execution(* *..UserDao.*(..))" advice-ref="txAdvice"/> </aop:config> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="insert*" rollback-for="java.sql.SQLException"/> <tx:method name="update*"/> <tx:method name="*" read-only="true"/> </tx:attributes> </tx:advice> </beans> 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2007-02-13
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <context-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/dataAccessContext-jta.xml /WEB-INF/applicationContext.xml </param-value> </context-param> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <welcome-file-list> <welcome-file>index.html</welcome-file> </welcome-file-list> <resource-ref> <res-ref-name>jdbc/DataSource</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> <resource-ref> <res-ref-name>jdbc/DataSource2</res-ref-name> <res-type>javax.sql.DataSource</res-type> <res-auth>Container</res-auth> </resource-ref> </web-app> UserDao.java import java.sql.SQLException; import java.util.List; public interface UserDao { public void insertUserAndAddress(List list)throws SQLException; } UserDaoImpl.java package dao; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; import java.util.List; import javax.sql.DataSource; public class UserDaoImpl implements UserDao { private DataSource ds; private DataSource ds2; public void insertUserAndAddress(List list) throws SQLException { Connection conn = null; Connection conn2 = null; Connection conn3 = null; Connection conn4 = null; PreparedStatement pre_stmt = null; // PreparedStatement pre_stmt2 = null; PreparedStatement pre_stmt3 = null; PreparedStatement pre_stmt4 = null; conn = ds.getConnection(); conn2 = ds.getConnection(); conn3 = ds2.getConnection(); conn4 = ds2.getConnection(); pre_stmt = conn .prepareStatement("update scott.user_info set password=?"); String ss = (String) list.get(0); pre_stmt.setString(1, ss); pre_stmt.executeUpdate(); ss = (String) list.get(1); pre_stmt3 = conn4 .prepareStatement("update scott.address set user_id=? where id=1"); pre_stmt3.setInt(1, Integer.parseInt(ss)); pre_stmt3.executeUpdate(); // 人为的制造错误,id是数字类型 ss = (String) list.get(2); String name = (String) list.get(3); String password = (String) list.get(4); pre_stmt4 = conn2 .prepareStatement("insert into scott.user_info(id,name,password) values(?,?,?)"); pre_stmt4.setString(1, ss); pre_stmt4.setString(2, name); pre_stmt4.setString(3, password); pre_stmt4.executeUpdate(); pre_stmt.close(); // pre_stmt2.close(); pre_stmt3.close(); pre_stmt4.close(); conn.close(); conn2.close(); conn3.close(); conn4.close(); } public DataSource getDs() { return ds; } public void setDs(DataSource ds) { this.ds = ds; } public DataSource getDs2() { return ds2; } public void setDs2(DataSource ds2) { this.ds2 = ds2; } } |
|
返回顶楼 | |
发表时间:2007-02-13
事务的回滚和边界的划分是正确的,最后回滚的时候有连接泄漏,可能是抛出的SQLException的问题,如果是抛出的是其他的业务层的异常的话,我想就不会有连接泄漏的问题,我测试的时候一时也想不到什么好的业务异常,就弄了个SQLException,试了一下。在这一点上,是比ejb要好,检查异常,也能回滚事务。
|
|
返回顶楼 | |