湖南seo网站策划,校园文化建设网站,一键生成个人网站,如何做好网络销售spring 多数据源配置spring 多数据源配置一般有两种方案#xff1a;1、在spring项目启动的时候直接配置两个不同的数据源#xff0c;不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。2、配置多个不同的数据源#xff0c;使用一个session…spring 多数据源配置spring 多数据源配置一般有两种方案1、在spring项目启动的时候直接配置两个不同的数据源不同的sessionFactory。在dao 层根据不同业务自行选择使用哪个数据源的session来操作。2、配置多个不同的数据源使用一个sessionFactory,在业务逻辑使用的时候自动切换到不同的数据源有一个种是在拦截器里面根据不同的业务现切换到不同的datasource;有的会在业务层根据业务来自动切换。但这种方案在多线程并发的时候会出现一些问题需要使用threadlocal等技术来实现多线程竞争切换数据源的问题。【本文暂时只讨论第一种方案】spring多事务配置主要体现在db配置这块配置不同的数据源和不同的session1、一下贴出 spring-db.xml配置xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd2、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);}}BaseDaopackage 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;OverrideTransactionalpublic void updateUserinfo() {UserEntity usernew UserEntity();user.setId(1);user.setUserName(李四4);UserInformationsEntity userInfonew 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多数据源的配置xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:contexthttp://www.springframework.org/schema/contextxmlns:aophttp://www.springframework.org/schema/aopxmlns:txhttp://www.springframework.org/schema/txxsi:schemaLocationhttp://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-3.0.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-3.0.xsdhttp://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsdhttp://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd${database.test1.url}${database.test1.username}${database.test1.password}${database.test2.url}${database.test2.username}${database.test2.password}所有代码请参考这里https://github.com/ityouknow/spring-examples