【问题标题】:How to dynamically manage multiple datasources如何动态管理多个数据源
【发布时间】:2011-08-31 20:38:53
【问题描述】:

其他主题已涵盖类似主题,但我找不到解决问题的明确解决方案。

我们想要实现的是设计一个能够:

  1. 在启动时读取数据源配置(包含多个数据源定义的 XML 文件,位于 WAR 文件之外,它不是应用程序上下文或休眠配置文件)
  2. 为它们中的每一个创建一个会话工厂(考虑到每个数据源都是具有不同架构的数据库)
  3. 在运行时根据用户输入切换到不同的数据源(用户可以选择他们想要使用的数据源)
  4. 提供正确的 dao 对象来管理用户请求。

目前我们有一个 DAO Manager 对象,它能够读取数据源配置文件并实例化多个会话工厂,并将它们保存在一个映射中。每个会话工厂都是使用包含正确休眠映射类(每个数据库模式不同)的配置创建的。此外,我们有多个 DAO 接口及其实现,用于访问“他们的数据库”。

此时,我们需要一种方法从 DAO 管理器获取特定的 DAO 对象,其中包含附加的正确会话工厂,这一切都基于用户请求(基本上是来自上述服务的调用,其中包含数据源 ID 或自定义数据源对象)。

理想情况下,服务层应该使用 DAO 管理器根据数据源 ID(例如)获取 DAO 对象,而不用担心它的实际实现:DAO 管理器会通过创建正确的 DAO 对象和根据数据源 ID 在其中注入正确的会话工厂。

我的问题是:

  • 这是一个很好的方法吗?
  • 如何使用 Spring 在 DAO 管理器中为每个 DAO 接口动态注入多个 DAO 实现?
  • 创建会话工厂后,有没有办法让 Spring 处理它们,就像我通常在 application-context.xml 中使用依赖注入所做的那样?
  • 二级缓存是否仍适用于每个会话工厂?

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    这是一个很好的方法吗?

    这可能是唯一可能的方法。所以,是的。

    如何使用 Spring 动态 在 DAO Manager 中注入多个 DAO 每个 DAO 的实现 界面?

    动态?我以为你想在启动时这样做。如果是这样,只需提供一个带有列表或数组的访问器:

    public void setMyDaos(List<Mydao> daos){
         this.daos = daos;
    }
    

    一旦会话工厂 创建了,有没有办法让Spring 像我通常做的那样处理它们 在内部进行依赖注入 应用程序上下文.xml?

    这个很难。我会说你可能不得不将你的 sessionFactory bean 存储在 scope=session

    【讨论】:

    • 嗨,肖恩,感谢您的回复。关于问题 n.2(如何在 DAO 管理器中设置 dao 实现),我想通过 DAO 管理器中的 application-context.xml 静态注入所有 DAO 实现,以便它可以返回正确的基于在一些输入鉴别器上。你认为这可能是一种方法吗?回到您的建议,该设置器是否在 DAO 管理器中定义?它会被Spring“调用”吗?再次感谢。
    • 你认为这是一条可行的路吗?是的,也许是use qualifiers该设置器是否在 DAO 管理器中定义? Spring会“调用”它吗?是的,是的,如果你打开自动装配
    • 再次感谢 Sean,事实证明自动装配和限定符对我来说非常有用!所以现在我只需要弄清楚如何让 Spring 管理我的会话工厂(如果可能的话),看看二级缓存会发生什么。非常感谢任何其他建议。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2019-12-30
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-25
    • 2017-12-17
    相关资源
    最近更新 更多