java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Nutz Dao与Spring集成

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);
            }
        }

    }

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文