【问题标题】:Dynamic data source routing in springSpring中的动态数据源路由
【发布时间】:2012-06-22 10:42:36
【问题描述】:

我在 PostgreSQL 中有一个具有三个相同架构的数据库。 现在我需要根据语言环境键(存储在用户会话中)为数据库操作选择特定的模式。我在某处发现这个东西类似于动态数据源路由。

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

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

【问题讨论】:

    标签: spring postgresql jakarta-ee transactions


    【解决方案1】:

    我建议使用这种方法:

    • 首先在 Spring MVC 配置中定义一个 locale interceptor 基于会话或更改拦截器。
    • 您现在可以使用LocaleContexHolder 获取附加线程上的当前语言环境。
    • 使用the reference blog post 定义您的动态路由数据源。数据源路由器上的参数将来自语言环境。使用LocaleContextHolder 确定区域设置,然后使用它来确定应使用哪个数据源。

    【讨论】:

      【解决方案2】:

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

      这可以通过使用顺序高于<tx:annotation-driven /> 的某些方面来实现。在这方面,您应该获取当前连接:

      DataSourceUtils.getConnection(dataSource)
      

      并发出以下 PostgreSQL 语句(有关 schema 参数的信息,请参阅:http://www.postgresql.org/docs/9.1/static/sql-set.html);

      set schema 'schemaname-on-the-basis-of-session-parameter';
      

      另见using schemas in postgres

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-05-15
        • 2015-12-11
        • 2014-09-24
        • 2023-04-01
        • 2021-11-23
        • 1970-01-01
        • 2021-02-21
        • 2019-03-31
        相关资源
        最近更新 更多