博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
spring 多数据源一致性事务方案
阅读量:7079 次
发布时间:2019-06-28

本文共 4018 字,大约阅读时间需要 13 分钟。

spring 多数据源配置

spring 多数据源配置一般有两种方案:

1、在spring项目启动的时候直接配置两个不同的数据源,不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。

2、配置多个不同的数据源,使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源,有一个种是在拦截器里面根据不同的业务现切换到不同的datasource;有的会在业务层根据业务来自动切换。但这种方案在多线程并发的时候会出现一些问题,需要使用threadlocal等技术来实现多线程竞争切换数据源的问题。

 

【本文暂时只讨论第一种方案】

spring多事务配置主要体现在db配置这块,配置不同的数据源和不同的session

1、一下贴出 spring-db.xml配置

 

2、dao层做了一个小的封装,将不同的SqlSessionFactory 注入到 SessionFactory,通过BaseDao来做简单的封装,封装不同库的基本增删改。dao实现层都集成于Basedao 这样的话,实现可以根据自己需要来选择不同的库来操作不同的内容。

session工厂

package com.neo.dao;import com.neo.entity.Entity;public class BaseDao extends SessionFactory{            public void test1Update(Entity entity) {    this.getTest1Session().update(entity.getClass().getSimpleName()+".update", entity);    }        public void test2Update(Entity entity) {       this.getTest2Session().update(entity.getClass().getSimpleName()+".update", entity);       }}

BaseDao

package com.neo.dao;import com.neo.entity.Entity;public class BaseDao extends SessionFactory{            public void test1Update(Entity entity) {    this.getTest1Session().update(entity.getClass().getSimpleName()+".update", entity);    }        public void test2Update(Entity entity) {       this.getTest2Session().update(entity.getClass().getSimpleName()+".update", entity);       }}

 

以上的配置在多数据源连接,正常的增删改都是没有问题的,但是遇到分布式的事务是就出问题:

测试代码:

package com.neo.service.impl;import javax.annotation.Resource;import org.springframework.stereotype.Service;import org.springframework.transaction.annotation.Transactional;import com.neo.dao.UserDao;import com.neo.dao.UserInformationsDao;import com.neo.entity.UserEntity;import com.neo.entity.UserInformationsEntity;import com.neo.service.UserService;@Servicepublic class UserServiceImpl implements UserService {        @Resource UserDao userDao;    @Resource UserInformationsDao userInformationsDao;    @Override    @Transactional    public void updateUserinfo() {        UserEntity user=new UserEntity();    user.setId(1);    user.setUserName("李四4");        UserInformationsEntity userInfo=new UserInformationsEntity();    userInfo.setUserId(1);    userInfo.setAddress("陕西4");        userDao.updateUser(user);    userInformationsDao.updateUserInformations(userInfo);        if(true){        throw new RuntimeException("test tx ");    }    }        }

 

在service添加事务后,更新完毕抛出异常,test2更新进行了回滚,test1 数据更新没有回滚。

 

解决方案添加分布式的事务,Atomikos和spring结合来处理。

Atomikos多数据源的配置

${database.test1.url}
${database.test1.username}
${database.test1.password}
${database.test2.url}
${database.test2.username}
${database.test2.password}

 

所有代码请参考这里:

https://github.com/ityouknow/spring-examples

转载地址:http://zcjml.baihongyu.com/

你可能感兴趣的文章
减少Linux 电耗 转自IBM
查看>>
DIOCP3-DIOCP1升级到DIOCP3
查看>>
SQL Server 中WITH (NOLOCK)浅析
查看>>
09网易校园招聘笔试题
查看>>
。一个通俗易懂的HMM例子
查看>>
freeswitch 挂断前执行脚本
查看>>
EffectManager
查看>>
python packages prebuild for windows
查看>>
这样就算会了PHP么?-10
查看>>
远程调用WMI安装软件
查看>>
从零开始学习jQuery (七) jQuery动画-让页面动起来!
查看>>
asp.net 操作word
查看>>
SQL Server 权限管理
查看>>
郎意难坚,侬情自热(文/王路)
查看>>
Form_Form Builder开发基于视图页面和自动代码生成包(案例)
查看>>
Android SDK Manager 中如果没有相应的镜像ARM XX Image
查看>>
简单聊下Unicode和UTF-8
查看>>
ASP.NET Web API的Controller是如何被创建的?
查看>>
在 Azure 上使用 Docker运行 Mono
查看>>
(转)JITComplier、NGen.exe及.NET Native
查看>>