标签:required imp 简化 ssr comm ref 模板 drive 捕获异常
1 事务管理器配置 2 <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"> 3 <property name="jdbcUrl" value="${db.jdbcUrl}" /> 4 <property name="user" value="${user}" /> 5 <property name="password" value="${password}" /> 6 <property name="driverClass" value="${db.driverClass}" /> 7 <!--连接池中保留的最小连接数。 --> 8 <property name="minPoolSize"> 9 <value>5</value> 10 </property> 11 <!--连接池中保留的最大连接数。Default: 15 --> 12 <property name="maxPoolSize"> 13 <value>30</value> 14 </property> 15 <!--初始化时获取的连接数,取值应在minPoolSize与maxPoolSize之间。Default: 3 --> 16 <property name="initialPoolSize"> 17 <value>10</value> 18 </property> 19 <!--最大空闲时间,60秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0 --> 20 <property name="maxIdleTime"> 21 <value>60</value> 22 </property> 23 <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 --> 24 <property name="acquireIncrement"> 25 <value>5</value> 26 </property> 27 <!--JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量。但由于预缓存的statements 属于单个connection而不是整个连接池。所以设置这个参数需要考虑到多方面的因素。 如果maxStatements与maxStatementsPerConnection均为0,则缓存被关闭。Default: 0 --> 28 <property name="maxStatements"> 29 <value>0</value> 30 </property> 31 <!--每60秒检查所有连接池中的空闲连接。Default: 0 --> 32 <property name="idleConnectionTestPeriod"> 33 <value>60</value> 34 </property> 35 <!--定义在从数据库获取新连接失败后重复尝试的次数。Default: 30 --> 36 <property name="acquireRetryAttempts"> 37 <value>30</value> 38 </property> 39 <!--获取连接失败将会引起所有等待连接池来获取连接的线程抛出异常。但是数据源仍有效 保留,并在下次调用getConnection()的时候继续尝试获取连接。如果设为true,那么在尝试获取连接失败后该数据源将申明已断开并永久关闭。Default: false --> 40 <property name="breakAfterAcquireFailure"> 41 <value>true</value> 42 </property> 43 <!--因性能消耗大请只在需要的时候使用它。如果设为true那么在每个connection提交的 时候都将校验其有效性。建议使用idleConnectionTestPeriod或automaticTestTable等方法来提升连接测试的性能。Default: false --> 44 <property name="testConnectionOnCheckout"> 45 <value>false</value> 46 </property> 47 </bean> 48 <!--DataSourceTransactionManager位于org.springframework.jdbc.datasource包下,数据源事务管理类,提供对单个javax.sql.DataSource数据源的事务管理,主要用于JDBC,Mybatis框架事务管理。 --> 49 <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 50 <property name="dataSource" ref="dataSource" /> 51 </bean>
1 业务中使用代码(以测试类展示) 2 import java.util.Map; 3 import javax.annotation.Resource; 4 import javax.sql.DataSource; 5 import org.apache.log4j.Logger; 6 import org.junit.Test; 7 import org.junit.runner.RunWith; 8 import org.springframework.jdbc.core.JdbcTemplate; 9 import org.springframework.test.context.ContextConfiguration; 10 import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; 11 import org.springframework.transaction.PlatformTransactionManager; 12 import org.springframework.transaction.TransactionDefinition; 13 import org.springframework.transaction.TransactionStatus; 14 import org.springframework.transaction.support.DefaultTransactionDefinition; 15 16 @RunWith(SpringJUnit4ClassRunner.class) 17 @ContextConfiguration(locations = { "classpath:spring-public.xml" }) 18 public class test { 19 @Resource 20 private PlatformTransactionManager txManager; 21 @Resource 22 private DataSource dataSource; 23 private static JdbcTemplate jdbcTemplate; 24 Logger logger=Logger.getLogger(test.class); 25 private static final String INSERT_SQL = "insert into testtranstation(sd) values(?)"; 26 private static final String COUNT_SQL = "select count(*) from testtranstation"; 27 @Test 28 public void testdelivery(){ 29 //定义事务隔离级别,传播行为, 30 DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 31 def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 32 def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED); 33 //事务状态类,通过PlatformTransactionManager的getTransaction方法根据事务定义获取;获取事务状态后,Spring根据传播行为来决定如何开启事务 34 TransactionStatus status = txManager.getTransaction(def); 35 jdbcTemplate = new JdbcTemplate(dataSource); 36 int i = jdbcTemplate.queryForInt(COUNT_SQL); 37 System.out.println("表中记录总数:"+i); 38 try { 39 jdbcTemplate.update(INSERT_SQL, "1"); 40 txManager.commit(status); //提交status中绑定的事务 41 } catch (RuntimeException e) { 42 txManager.rollback(status); //回滚 43 } 44 i = jdbcTemplate.queryForInt(COUNT_SQL); 45 System.out.println("表中记录总数:"+i); 46 } 47 48 }
2)使用TransactionTemplate,该类继承了接口DefaultTransactionDefinition,用于简化事务管理,事务管理由模板类定义,主要是通过TransactionCallback回调接口或TransactionCallbackWithoutResult回调接口指定,通过调用模板类的参数类型为TransactionCallback或TransactionCallbackWithoutResult的execute方法来自动享受事务管理。
TransactionTemplate模板类使用的回调接口:
还是以测试类方式展示如何实现
1 @Test 2 public void testTransactionTemplate(){ 3 jdbcTemplate = new JdbcTemplate(dataSource); 4 int i = jdbcTemplate.queryForInt(COUNT_SQL); 5 System.out.println("表中记录总数:"+i); 6 //构造函数初始化TransactionTemplate 7 TransactionTemplate template = new TransactionTemplate(txManager); 8 template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED); 9 //重写execute方法实现事务管理 10 template.execute(new TransactionCallbackWithoutResult() { 11 @Override 12 protected void doInTransactionWithoutResult(TransactionStatus status) { 13 jdbcTemplate.update(INSERT_SQL, "饿死"); //字段sd为int型,所以插入肯定失败报异常,自动回滚,代表TransactionTemplate自动管理事务 14 }} 15 ); 16 i = jdbcTemplate.queryForInt(COUNT_SQL); 17 System.out.println("表中记录总数:"+i); 18 }
1 <!-- 2 <tx:advice>定义事务通知,用于指定事务属性,其中“transaction-manager”属性指定事务管理器,并通过<tx:attributes>指定具体需要拦截的方法 3 <tx:method>拦截方法,其中参数有: 4 name:方法名称,将匹配的方法注入事务管理,可用通配符 5 propagation:事务传播行为, 6 isolation:事务隔离级别定义;默认为“DEFAULT” 7 timeout:事务超时时间设置,单位为秒,默认-1,表示事务超时将依赖于底层事务系统; 8 read-only:事务只读设置,默认为false,表示不是只读; 9 rollback-for:需要触发回滚的异常定义,可定义多个,以“,”分割,默认任何RuntimeException都将导致事务回滚,而任何Checked Exception将不导致事务回滚; 10 no-rollback-for:不被触发进行回滚的 Exception(s);可定义多个,以“,”分割; 11 --> 12 <tx:advice id="advice" transaction-manager="transactionManager"> 13 <tx:attributes> 14 <!-- 拦截save开头的方法,事务传播行为为:REQUIRED:必须要有事务, 如果没有就在上下文创建一个 --> 15 <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED" timeout="" read-only="false" no-rollback-for="" rollback-for=""/> 16 <!-- 支持,如果有就有,没有就没有 --> 17 <tx:method name="*" propagation="SUPPORTS"/> 18 </tx:attributes> 19 </tx:advice> 20 <!-- 定义切入点,expression为切人点表达式,如下是指定impl包下的所有方法,具体以自身实际要求自定义 --> 21 <aop:config> 22 <aop:pointcut expression="execution(* com.kaizhi.*.service.impl.*.*(..))" id="pointcut"/> 23 <!--<aop:advisor>定义切入点,与通知,把tx与aop的配置关联,才是完整的声明事务配置 --> 24 <aop:advisor advice-ref="advice" pointcut-ref="pointcut"/> 25 </aop:config>
1 <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> 2 <property name="dataSource" ref="dataSource"/> 3 </bean> 4 <tx:annotation-driven transaction-manager="txManager"/> //开启事务注解
标签:required imp 简化 ssr comm ref 模板 drive 捕获异常
原文地址:https://www.cnblogs.com/wangjing666/p/9655843.html