Nutz Dao与Spring集成实践
作者:CV工程师(Ctrl)
文章介绍了在集成Spring和Nutz时处理事务管理的几种方式,包括手动管理、Spring声明式事务管理以及将事务交给Spring管理的方法
一、集成方式
1、采用Spring的IOC,但是事务还是采用Nutz自己管理控制;
2、采用Spring的声明式事务管理控制;
二、IOC
直接依据数据源注入即可
@Bean
public NutDao nutz(DataSource dataSource) {
return new NutDao (dataSource);;
}此时Nutz Dao的事务并不能通过Spring的事务来管理(如@Transactional注解、手动事务等),还是通过Nutz本身的 Trans.exec(() -> {}) 进行管理
例:
public void testService() {
Trans.exec(() -> {
dao.insert("test_table", Chain.make("id", 3));
throw new RuntimeException("test exception");
});
}三、将事务交给Spring管理
step1:继承NutDao类,重写run方法
public class SpringNutDao extends NutDao {
public SpringNutDao(DataSource dataSource) {
super(dataSource);
}
@Override
public void run(ConnCallback callback) {
Connection con = DataSourceUtils.getConnection(getDataSource());
try {
callback.invoke(con);
} catch (Exception e) {
if (e instanceof RuntimeException) {
throw (RuntimeException) e;
} else {
throw new RuntimeException(e);
}
} finally {
DataSourceUtils.releaseConnection(con, getDataSource());
}
}
}step2:将继承类注入
@Bean
public NutDao nutz(DataSource dataSource) {
return new SpringNutDao(dataSource);
}step3:将数据源事务管理注入
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}例1:
@Transactional
public void testService() {
dao.insert("test_table", Chain.make("id", 3));
throw new RuntimeException("test exception");
}例2:
@Autowired
private PlatformTransactionManager transactionManager;
public void testService() {
DefaultTransactionDefinition def = new DefaultTransactionDefinition();
TransactionStatus transactionStatus = transactionManager.getTransaction(def);
try{
dao.insert("test_table", Chain.make("id", 3));
throw new RuntimeException("test exception");
}catch (Exception e){
if (transactionStatus.isCompleted()) {
System.out.println("事务已完成,无需回滚");
}else {
transactionManager.rollback(transactionStatus);
}
}
}总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
