spring中的动态数据源路由

spring中的动态数据源路由,spring,postgresql,jakarta-ee,transactions,Spring,Postgresql,Jakarta Ee,Transactions,我在PostgreSQL中使用了三个相同模式的单个DB。 现在,我需要根据区域设置键(存储在用户会话中)为DB操作选择特定的模式。我发现这和动态数据源路由类似 有人知道如何在春天实现这一点吗? 无论如何,这会影响事务管理吗? 如果可能,请分享任何示例代码 如有任何建议,将不胜感激。 谢谢和问候。如果您有单个数据库,那么动态方面不应该与连接池相关-所有连接仍然用于单个数据库。您所需要做的就是在启动事务后动态设置适当的模式 这可以通过使用顺序高于的某些方面来实现。在这方面,您应该获得当前连接: Da

我在PostgreSQL中使用了三个相同模式的单个DB。 现在,我需要根据区域设置键(存储在用户会话中)为DB操作选择特定的模式。我发现这和动态数据源路由类似

有人知道如何在春天实现这一点吗? 无论如何,这会影响事务管理吗? 如果可能,请分享任何示例代码

如有任何建议,将不胜感激。
谢谢和问候。

如果您有单个数据库,那么动态方面不应该与连接池相关-所有连接仍然用于单个数据库。您所需要做的就是在启动事务后动态设置适当的模式

这可以通过使用顺序高于
的某些方面来实现。在这方面,您应该获得当前连接:

DataSourceUtils.getConnection(dataSource)
并发出以下PostgreSQL语句(请参阅:有关
schema
parameter的信息)

另见


至于事务管理,事务与物理连接和会话相关。另一方面,模式是一种名称空间,因此您不必更改事务管理,只需在用户请求处理期间在每个事务的开头设置当前模式即可。

我建议使用这种方法:

  • 首先在SpringMVC配置中定义一个基于会话或更改的拦截器
  • 现在可以使用获取附加线程上的当前区域设置
  • 用于定义动态路由数据源。数据源路由器上的参数将来自区域设置。使用
    LocaleContextHolder
    确定区域设置,然后使用它确定应该使用哪个数据源
set schema 'schemaname-on-the-basis-of-session-parameter';