在Spring应用程序(使用Spring的声明式事务管理)中使用JPA / Hibernate时,在请求中首次启动事务时,会创建Hibernate会话并按顺序从数据源获取数据库连接执行第一笔交易。请求中的任何后续事务都将重用会话和连接。有没有办法强制Hibernate(或Spring的事务管理系统)从后续事务的数据源获取新连接?
背景信息以及我想要实现的目标
我使用AbstractRoutingDatasource的自定义实现在主服务器和复制的从属(只读)数据库之间路由数据库请求。我创建了带有数据源路由信息的自定义注释和AOP Aspect,它拦截了使用我的自定义注释注释的方法,以创建一个框架,除了@Transactional之外,还可以添加额外的数据源路由注释以选择数据源(master或应该执行交易的奴隶。 Aspect通知路由数据源当前线程中请求的下一个连接应在事务开始之前转到特定数据源(如注释中所定义)。问题是这只适用于第一个事务,因为Hibernate缓存连接并且不会为下一个事务请求新的连接。
答案 0 :(得分:0)
您需要实施自定义location
。 Hibernate默认会带有locationsDic
。但是,大多数人最终都使用c3p0(许多人甚至不知道它),proxool,Hikari或其他一些实现。
所有这些(包括Hibernate的默认设置)都会缓存连接(这是它们的主要目的)。您可能需要创建一个连接提供程序,该提供程序具有对其他两个连接提供程序的引用(每个数据源一个)。内部连接提供程序可以是c3p0或您要使用的任何其他实现。
This article给出了概念的基本概述(以及描述要为自己提供的属性)。