spring 双数据源开发过程遇到的坑

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_28929579/article/details/84583693


因业务需要,要连接两个数据源,因此要把公司框架包改成双数据源配置。下面是新手避坑经验。。。

java.lang.IllegalArgumentException: No persistence unit with name ‘xxx’ found

公司框架jar包原来是单数据源的,既然改成双数据源,那不很简单?把xml配置中的persistenceUnitManager、entityManagerFactory、transactionManager、dataSource和transaction-manager都复制出来,换个名字,其中entityManagerFactory的persistenceUnitName属性不再是default变成xxx,并且也在复制好的baseDao的@PersistenceContext注解上改为xxx,在这里插入图片描述
然后启动就报错拉No persistence unit with name ‘xxx’ found。除了这两个地方,还要哪里加xxx了?百度说在META-INF/persistence.xml下找,项目中却没有阿!后来猛的一想,公司框架jar包中可能会有!果然找到了、、、把jar中的拿出来放到src下,然后照着添加xxx,重启ok。

只能查询不能增删?

数据源配好了,可以愉快的开发了,查询也是有数据的,后来要插入日志表,没反应?也不报错?但是另一个数据源的dao方法可以插入,后来想到是不是没有配置事务阿,但是service上确实加上@Transactional,坑就在这,@Transactional默认的,也就是default数据源管理的事务,用另一个数据源的dao肯定不能开启事务,于是在某个方法上加上@Transactional(value=“transactionManagerNew”) 用来指明哪个manager。运行ok保存成功

不能在事务出错后catch异常另外操作?

要写个定时任务调用存储过程并把结果保存日志表,理所当然的用try包含住了存储过程,并在catch中处理保存失败字段,没有异常正常保存。这样做看起来没错,但是当我换成不存在的存储过程名,会发现虽然catch住了异常,但是整个事务会回滚,也就导致不能查插入日志表了,遇到了和https://bbs.csdn.net/topics/390688795 一样的困扰。经过试验,解决方法如下(事务下放到dao层):
1.新建service,不加@Transactional
2.在dao层中,新建两个类,一个用于调用存储过程,一个用来更新日志,两个方法头都加上@Transactional。
3.在新建service中用try包裹调用方法,然后调用保存日志方法。

猜你喜欢

转载自blog.csdn.net/qq_28929579/article/details/84583693
今日推荐