Spring MVC 多数据源,配置完事务之后就不能正常切换数据源,求大神指点 3C

两张附图事务没配置的时候数据源切换正常,加上事务之后就一直显示的是默认连接的数据源,
这是为什么啊??百思不得其解,,求神哥神姐解惑啊
数据源
红框里边的是我配置的事务

这个是数据源切换代码
数据源切换代码
切换的时候就是 每次在掉底层方法之前先设置下数据库 向下面这样

MultipleDataSource.setDataSourceKey("yz_dataSource");
MultipleDataSource.setDataSourceKey("news_dataSource");

8个回答

我也遇到了这个问题,仔细debug了一下,结论如下:
1. AOP可以触发数据源字符串的切换,这个没问题
2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发
3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改

综上所述:
如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行

nmgrd
lhever_ 楼上给出了这样一个结论:我也遇到了这个问题,仔细debug了一下,结论如下: 1. AOP可以触发数据源字符串的切换,这个没问题 2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发 3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改 综上所述: 如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行。 事实上可以通过@Order注解调整AOP的顺序,保证AOP切换数据源的动作在determineCurrentLookupKey方法之前先调用就可以
大约一年之前 回复
nmgrd
lhever_ 我也遇到了这个问题,仔细debug了一下,结论如下: 1. AOP可以触发数据源字符串的切换,这个没问题 2. 数据源真正切换的关键是 AbstractRoutingDataSource 的 determineCurrentLookupKey() **被调用,此方法是在open connection**时触发 3. 事务是在connection层面管理的,启用事务后,一个事务内部的connection是复用的,所以就算AOP切了数据源字符串,但是数据源并不会被真正修改 综上所述: 如果要使用事务,还是别用determineCurrentLookupKey()这种方法切数据源了,得配置多个才行
大约一年之前 回复
nmgrd
lhever_ 楼上给出了这样一个结论:
大约一年之前 回复
Xgx120413
Cansluck 你好,要怎么配置啊??
一年多之前 回复

把数据源切换代码贴出来,你用spring声明式的事务,它是绑定线程的,也不知道你切换是什么模式,不行自己手工写编程式的事务,也不难,不过aop要自己写罢了

还有,spring的事务是在切点中,会判断当前线程是否有事务,没有则会将数据源注入事务然后用threadload存起来,按照你这样的配置,事务始终也只会对当前数据源有效,当你切换数据源要么你自己也在spring的事务内同时也换数据源,不过这又要自己提交原来的事务!得不偿失,更麻烦!我是用spring编程式的事务实现的,事务自己管理,爱怎么换就怎么换

sinat_19351993
哈哈书架 我把那个代码贴出来了你看下
大约 4 年之前 回复

@tinweisog

数据源切换代码

切换的时候就是 每次在掉底层方法之前先设置下数据库 向下面这样

MultipleDataSource.setDataSourceKey("yz_dataSource");

MultipleDataSource.setDataSourceKey("news_dataSource");

哥们,遇到和你一样的问题了,如果你解决了,麻烦你和我说一下,谢谢了 1127653664

你如果事务是在service层,那么你切换数据源要在service之前切换,你如果在service里面是不能切换成功的

事物的情况下,手动切换determineTargetDataSource即可,解决只换名称而不换DataSource的问题

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Spring Boot配置多数据源动态切换数据源
一、应用场景    我们再开发中经常遇到应用不同数据库的数据,比如一部分需要使用Mysql下的数据库,一部分需要使用Sql Server的数据库,主从库分离等等。这是需要我们配置多数据源来满足开发需要。...
Spring 多数据源 事务配置
在spring里面使用多数据源,事务处理的时候需要指定使用的数据源,否则可能会出现事务不生效的情况。 @Transactional(rollbackFor = RuntimeException.class, transactionManager = “transactionManager”) transactionManager就是配置的事务管理器默认使用的数据源是配置文件里面的第一个数据源。
spring多数据源事务配置
我们项目现在需要做一个数据同步的功能,使用两个数据源链接两个不同地址相同结构的数据库(MySQL),我配置了AbstractRoutingDataSource来切换数据源。rn使用定时器每小时调用A数据库数据保存到B中。其中需要配置事务,如果A出错AB都要回滚。这一步不知道是不是需要使用分布式事务(Atomikos)?rnrncontext.xml:rn[code=html]rnrn rn rn rn rn $jdbc.local.urlrn $jdbc.local.usernamern $jdbc.local.passwordrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn $jdbc.remote.urlrn $jdbc.remote.usernamern $jdbc.remote.passwordrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrn rn rn rn rn rn $hibernate.dialectrn $hibernate.show_sqlrn $hibernate.format_sqlrn rn rn rn rn com.ht.ourally.*.entityrn com.ht.mobile.*.entityrn com.ht.alipay.entityrn rn rn rnrn rn rn truern rn rnrn rn rn rnrn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rnrnrn rnrnrn rn rn rn[/code]rnrnDynamicDataSource:rn[code=java]rnpublic class DynamicDataSource extends AbstractRoutingDataSource rnrn @Overridern protected Object determineCurrentLookupKey() rn return DBContextHolder.getCustomerType();rn rnrn[/code]rnDBContextHolder:rn[code=java]rnpublic class DBContextHolder rnrn public static final String DATASOURCE_LOCAL = "dataSourceLocal";rnrn public static final String DATASOURCE_REMOTE = "dataSourceRemote";rnrn private static final ThreadLocal contextHolder = new ThreadLocal();rnrn public static void setCustomerType(String customerType) rn contextHolder.set(customerType);rn rnrn public static String getCustomerType() rn return contextHolder.get();rn rnrn public static void clearCustomerType() rn contextHolder.remove();rn rnrnrn[/code]rnTakeRemoteTask定时器:rn[code=java]rn@Scheduled(cron = "*/5 * * * * ?")rn public void main() rn System.out.println("==========================抓取远程数据库数据开始");rn try rn this.doBaseCompany();rn System.out.println("==========================抓取远程数据库数据结束");rn catch (Exception e) rn e.printStackTrace();rn rn rnrn /**rn * @Title: doBaseCompanyrn * @Description: TODO 物业企业任务rn * @author lindapengrn * @returnrn */rn private boolean doBaseCompany() rn if (!Boolean.valueOf(prop.get("BaseCompany").toString()))rn return true;rn System.err.println(DBContextHolder.getCustomerType());rn DBContextHolder.setCustomerType(DBContextHolder.DATASOURCE_LOCAL); // 切换数据源到本地rn System.err.println(DBContextHolder.getCustomerType());rn SysRole role = new SysRole();rn role.setCompanyId("lindp1");rn role.setRoleName("lindp1");rn sysRoleService.addSysRole(role);rnrn System.err.println(DBContextHolder.getCustomerType());rn DBContextHolder.setCustomerType(DBContextHolder.DATASOURCE_REMOTE); // 切换数据源到远程rn System.err.println(DBContextHolder.getCustomerType());rn SysRole role2 = new SysRole();rn role2.setCompanyId("lindp2");rn role2.setRoleName("lindp2");rn sysRoleService.addSysRole(role2);rn return true;rn rn[/code]rnrn我以这种配置运行有两种问题:rn1.切换数据源无效,lindp1和lindp2都会保存到远程数据库中rn2.去除事务配置后切换数据源正常,只是没有事务了
spring mvc 多数据源的配置
spring-XXX.xml 配置文件中 配置
Spring MVC 配置多数据源
本来项目是一个数据源(Mysql),因为业务需求,需要添加Oracle数据源 查了很多资料之后综合了一下 环境:spring 3.0 下面是spring配置 配置两个BasicDataSource:dataSourceMySql,dataSourceOra
spring mvc 配置多数据源
spring 配置多数据源
Spring事务结合多数据源切换
首先是一个问题,数据源什么时候被确认的 答:在调用dao层的方法的时候被确认的 当配置事务的时候,事务需要生成代理类,而事务的代理类的生成需要被被代理类和一个数据源, 所以在调用service层方法的时候,就确定了数据源 也就是说在配置事务的时候只能在调用service层方法之前之前切换数据源
Spring MVC 切换数据源
Spring MVC 动态加载数据库,数据源 打印json,myeclipse + mysql
spring mvc myibatis 多数据源切换
配置了两个数据源, 可以做到切换rnrnrn默认的是oracle, 可是我就想用到一次mysql,rnrn切换用完之后,在去调别的方法的时候,有的时候会去用,mysql 数据源, 这样就报错了。rnrnrn就是说该用oracle 的地方却用了mysql ,用了一次之后怎么才能不用再配置了,就用默认的呢rnrn[code=java] rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn rn [/code]
spring+myBatis 配置多数据源,切换数据源
一个项目里一般情况下只会使用到一个数据库,但有的需求是要显示其他数据库的内容,像这样,我认为有两种做法 1、在使用另一个数据库的项目里写一些restful接口,满足移动端PC端的同时也满足其他应用调用数据的需求; 2、就是在项目里配置多数据源; 我现在就是要使用另一个数据库的数据,想到了以上两种方法,为了更加熟悉spring,我打算使用第二种方案; 我在百度上查了好多关于spring配置多
spring boot多数据源配置,多数据源事务
springboot目录 Spring Boot 源码深入分析 spring boot多数据源配置,多数据源事务 springboot 中数据源配置,连接池配置,源码剖析,如何选择连接池 阅读本文前 ,请先阅读笔者另一片文章Spring Boot 源码深入分析 需求描述 在业务开发中,需要读写分离,或者需要配置多个数据源,接下来我们看看在springboot中如何配置多数据...
spring 数据源,事务配置
oracle.jdbc.driver.OracleDriver jdbc:oracle:thin:@10.4.52.223:1521:orcl PROPAGATION_REQUIRED,-Exception PRO...
spring无事务的数据源切换,和带事务的数据源切换
最近在配置spring框架时需要使用多数据源,其中遇到一些问题,特此记录 无事务数据源切换 见 http://blog.csdn.net/shadowsick/article/details/8878448  主要说一下带事务数据源切换的配置 首先在spring-database.xml中配置两个数据源(默认数据源),和应用的切面
spring ibatis 多数据源 事务配置
网上找的,spring+ibatis+struts1.2 的多数据源事务配置。没试过。先做下记录。 jdbc.properties文件内容: jdbc2.driverClassName=net.sourceforge.jtds.jdbc.Driver jdbc2.url=jdbc:jtds:sqlserver://10.101.122.9:1433/testdb;charset=gb23...
spring mvc 多数据源配置 根据package配置不同的数据源
我的博客原文地址 http://www.yujunyi.com/java/spring-mvc/353.html 欢迎访问 背景 有时候项目中可以需要连接两个数据库。因此就需要用到多数据源配置。 原理就是配置两个dataSource,两个entityManagerFactory分别使用不同的dataSource,并设置不同的package扫描路径。 配置文件 a...
Spring MVC事务配置
一、      XML,使用tx标签配置拦截器实现事务 一、      Annotation方式 以下所使用环境为Spring4.0.3、Hibernate4.3.5
Spring mvc 配置mongodb多数据源
由于项目前期业务设计的原因,不同CP的数据放置在了同一个ip和端口的mongdb中,6个CP数据在同一个ip和端口下,但是数据库的名称、集合的名称各不相同。现在需要一个查询系统,根据选择不同的cp去查询不同的database和集合拿到需要展现的数据解决思路:将不同cp对应的数据库的名称和集合的名称存放在mysql中的一张表里(db_info),初始化时将db_info中取出所有的mongodb数据库
Java spring mvc多数据源配置
转自:http://www.itpub.net/thread-1906608-1-1.html 1、首先配置两个数据库 [code="xml"] ...
MVC 求大神指点
小弟刚刚看了几天MVC,有一些地方不是很明白,希望各位帮忙讲解一下。rn(1)MVC的路由机制rnMVC中路由有好几种定义,比如controller/action/id或者reporttype/year/month/day,系统路由设置是放在Global.asax文件中的,,,貌似只能设置一种默认路由吧,一般默认为controller/action/id,一个系统中只能有一个路由定义吗?那如果我打开报表,该怎么打开呢?rn(2)MVC怎么从数据库中已存在的表中读取数据,而不是通过EFCodeFirst方式新增的表。rn(3)我自定义了一个远程验证(Remote Validation),当不满足条件时是可以验证,但是当我保存数据的时候,确没反应。如果把我在Model上把它的特性去掉,就可以保存了。rn代码如下:rn[color=#FF0000]Controller[/color]rn public JsonResult CheckTitleUnqie(string Title)rn rn if (Title.Length > 5)rn rn return Json("标题太长了", JsonRequestBehavior.AllowGet);rn rn elsern rn return Json("",JsonRequestBehavior.DenyGet);rn rn rn[color=#0000FF]下面这个保存方法根本进不来。[/color]rn [HttpPost]rn public ActionResult Edit(Movie model)rn rn var movie = db.Movies.Find(model.ID);rn tryrn rn UpdateModel(movie);rn db.SaveChanges();rn return RedirectToAction("Details", new id = movie.ID );rn rn catch (Exception e)rn rn ModelState.AddModelError("", "修改失败");rn rn return View(movie);rn rnrn[color=#FF0000]Model:[/color]rnpublic class Moviern rn public int ID get; set; rn [Required(ErrorMessage="电影标题不能为空")]rn //[StringLength(10,ErrorMessage="电影标题不能超过10个字符")]rn [Remote("CheckTitleUnqie", "Movie")]rn public string Title get; set; rn public DateTime ResealseDate get; set; rn //[Required(ErrorMessage = "价格不能为空")]rn [Price(ErrorMessage = "价格不合理")]rn //[RegularExpression(@"^(0|1-9\d)$",ErrorMessage="")]rn public float Prices get; set;rn [Required(ErrorMessage = "0不能为空")]rn public string Type get; set; rn rn视图的就不贴了,应该没关系吧。
Spring boot 2.0 多数据源切换(事务问题)
如果你已经配置好了多数据源,那么事务的配置步骤跟单数据源一样。 即:            第一步:@EnableTransactionManagement(打开事务注解扫描)            第二步:为需要加事务的方法上添加@Transactional 对于网上大多数的说法,我不敢苟同。证据如下: 在不添加注解@Transactional时  添加完@Transaction...
SpringBoot配置多数据源实现动态切换数据源
通过简单的demo实现SpingBoot多数据源配置并动态切换多数据源
spring mvc 多数据源配置 利用AOP手动切换
我的博客原文地址 http://www.yujunyi.com/java/spring-mvc/359.html 欢迎访问 背景 spring mvc 多数据源还有一种实现方式,利用 AOP 进行手动切换。 基本原理是,我们自己定义一个 DataSource 类 DynamicDataSource ,来继承 AbstractRoutingDataSource ,然后在配置文件中...
Spring 多数据源事务配置问题
在SpringSide 3 中,白衣提供的预先配置好的环境非常有利于用户进行快速开发,但是同时也会为扩展带来一些困难。最直接的例子就是关于在项目中使用多个数据源的问题,似乎 很难搞。在上一篇中,我探讨了SpringSide 3 中的数据访问层,在这一篇中,我立志要解决多数据源配置的难题,我的思路是这样的: 第一步、测试能否配置多个DataSource 第二步、测试能否配置多个SessionFa...
spring mvc 配置多个数据源
1.在项目的applicationContext.xml中配置多个数据源 com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test root myadmin com.mysql.jdbc.Driver jdbc:mysql://localhost:3306/test2 root myadmin
spring mvc 事务配置+异常处理
NULL 博文链接:https://gary-bu.iteye.com/blog/2025026
spring 多数据源事务案例
spring+mybatis+atomikos,java分布式事务。 由于网上的多数据源事务的帖子大多是2010年以前的,现在spring都已经到4.X了,有些类已经弃用了。 原先很多都是用jotm实现的,但是由于spring的升级,totm的本地化实例那个类已经找不到了,所以我使用了atomikos。 因为xa接口的事务开销比较大,在项目中如果全部使用分布式的话,那么开销也是很大的,所以在项目中分别部署了分布式事务和jdbc事务,这样可以根据需求自由搭配。 如有疑问可以加群 369091722 联系 管理员bane (就当给群打个广告,别介意)
Spring多数据源 多事务
因项目业务需要同时连接两个数据库,同时需要事务支持,参考网上资料试过实现spring接口来自动切换数据源,但是事务只有一个数据源可以使用,故采用如下方式配置,扫描所有map文件,通过类上方注解区分使用哪个数据源,通过在service方法中配置@Transactional(value="事务名")来判断使用哪个事务。一、数据源配置1、添加两个数据源    <bean id="ADataSour...
spring 多数据源事务问题
spring整合mybatis,2个数据源,使用DynamicDataSource+aop,在方法调用之前根据方法上的注解来切换数据源, xml version="1.0" encoding="UTF-8"?> xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/200
Spring 多数据源事务配置问题(下)
http://blog.163.com/ljxe_mail/blog/static/1572532320110131334634/
spring 多数据源事务
spring 3对多数据源的事务管理可以不依赖JTA
spring + mybatis 多数据源事务
1.配置Druid数据库数据源 <bean id="master_dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
Spring多数据源JTA事务
    当我们的项目中需要应用到多个数据源时,事务的管理就很重要了。而Spring的JTA事务就很好的帮助了我们进行了多数据源的事务处理。 通过集成JOTM,直接在Spring中使用JTA事务     JOTM(Java Open Transaction Manager)是ObjectWeb的一个开源JTA实现,它本身也是开源应用程序服务器JOnAS(Java Open Application S...
Spring多数据源事务问题
当使用Springboot的时候如果使用@Transaction标签去管理事务的时候,会出现找不到指定的事务bean问题,因为同时配置了两个或多个数据源,@Transaction标签会出现不知道处理那个事务的问题。 此时需要使用@Transaction标签中的transactionmanager去指向你所配置的数据源,即@Transaction(transactionmanager = “......
【spring boot】 mybatis配置双数据源/多数据源
前言 spring boot 2.0.0.RELEASE maven 3.5 eclipse 4.9.0 mybatis 1.3.2 mybatis generator 1.3.2 pagehelper(mybatis 分页插件) 1.2.5 oracle 12c 在spring boot项目中,使用mybatis操作数据库,很方便。经过亲测,比jpa好用。 mybatis提供了代码生成器my...
Spring动态切换多数据源
最近由于工作需要,项目中需要实现多数据源切换的功能。之前在网上找了很多的资料,大多是在配置文件中已经配置好数据源,而在数据库中配置并动态添加的却很少。目前已实现的功能是数据源可以在数据库中进行配置,也可以在jdbc.properties配置文件中配置多个数据源。
Spring 多数据源动态切换
为了实现多数据源的动态切换,降低代码耦合度,特地使用了AOP   第一步就要先配置多个数据源支持,下面的这个是我配置的两个数据源和多数据源支持。我这个是没有用mybatis和hibernate的,直接用的jdbcTemplate. ${driverClassName} ${url} ${username} ${password} 150 20
Spring中的多数据源和@Transactional事务配置
基础Dao/Mapper定义public interface BaseMapper { // read public Entity get(Integer id); } public interface JdbuyBaseMapper extends BaseMapper{ } public interface LifecycleBaseMapper{ }import org.sp...
Spring多数据源切换
涉及公司机密一些敏感点不易露出,如有交流或不懂请加本人QQ:787753924 个人劳动成果,转载请注明出处:前段时间所做的工作涉及到两个不同的服务器不同的数据库之间的数据的导入,所以用到了多数据源的切换,这里的数据源切换是通过AOP 将Mapper(持久层)层切开,针对这个切入点生成代理对象,在前置通知里面为目标方法赋予数据库的连接属性,废话不多说,首先说几个要用到的知识点: 1.org.spr
SpringBoot多数据源及事务配置
多数据源配置 其实多数据源的配置大体上跟Spring是相同的,不同之处仅在于SpringBoot推崇省略xml配置,取而代之使用JavaConfig来配置多数据源 针对目前所使用的Spring+MyBatis框架而言,数据源的配置最重要的两点是配置DataSource以及SqlSessionFactory,然而为了实现动态数据源我们还需要拓展AbstractRoutingDataSou
SpringBoot多数据源配置事务
在多数据源中配置事务,其实对于SpringBoot来很简单,当然这个的前提是首先把多数据源都配好的情况下,如果不会多数据源配置,请看该系列 SpringBoot整合多数据源首先在启动类配置 @SpringBootApplication @EnableTransactionManagement public class AccountApplication { public static vo
相关热词 c++和c#哪个就业率高 c# 批量动态创建控件 c# 模块和程序集的区别 c# gmap 截图 c# 验证码图片生成类 c# 再次尝试 连接失败 c#开发编写规范 c# 压缩图片好麻烦 c#计算数组中的平均值 c#获取路由参数