【问题标题】:Hibernate + Spring using multiple datasources?Hibernate + Spring 使用多个数据源?
【发布时间】:2010-10-26 01:04:50
【问题描述】:

我正在开发一个使用 Spring MVC 2.5 和 Hibernate 的 Web 应用程序。

应用程序的一个要求是它必须能够将一些对象导出到外部数据库。我想我不妨使用我现有的数据层并将对象保存到外部源。

我是 Spring 和 Hibernate 的新手,我想我只是想知道我应该如何处理这个问题。现在一切都通过注释自动连接起来。我猜我必须创建一个新的 dataSource bean、一个新的 sessionFactory 和一个 transactionManager...也许...但是...

  1. 我只希望在用户专门“导出”时可以连接到外部数据源。

  2. 自动装配会妨碍我吗?当我为导出过程实例化 DAO 时,如何告诉 Spring 注入适当的 sessionFactory? (我通过构造函数自动装配)我应该以编程方式创建我的会话工厂(等),然后手动实例化我的 DAO 吗?如果是这样,这会“覆盖”自动装配注释吗?

如果有人可以引导我完成使此类工作正常工作的基本过程,我想我不需要特别回答上述问题。谢谢!

【问题讨论】:

标签: java hibernate spring spring-mvc


【解决方案1】:

在 Spring 上下文中配置多个数据源和会话工厂本身不会成为问题,但它确实会降低自动装配的吸引力。

您可以使用@Qualifier 注释来告诉自动装配选择哪一个,但我建议不要使用自动装配,而是使用<property> 或<constructor-arg> 显式注入正确的数据源和会话工厂。

如果两个数据源都由您的应用服务器管理,则事务管理器可能会在两个数据源之间共享,但听起来两个数据源之间的事务完整性不是您的要求,并且具有单独的事务每个数据源就足够了。

【讨论】:

  • 如何在两个数据源之间共享事务管理器?我没有看到带有 SessionFactory 或类似列表的设置器。
  • @NieldeWet:多数据源交易完全不同。分布式事务很难。为此,您需要 JavaEE 中 JTA 实现的全部功能,然后使用 Spring 的 JtaTransactionManager 与您的应用程序集成。
【解决方案2】:

幸运的是,Spring 已经为此提供了解决方案:AbstractRoutingDataSource。它基本上充当多个 DataSource 的 Facade,并允许您对其进行子类化并实现您需要决定应该使用哪个 DataSource 的任何逻辑。一些细节在这里:

http://blog.springsource.com/2007/01/23/dynamic-datasource-routing/

这允许您在一个地方处理您的数据源查找逻辑。你的 DAO 层和 SessionFactory 不需要调整,只是你需要将 AbstractRoutingDataSource 的子类注入 Hibernate SessionFactory。

【讨论】:

  • 如果在运行时只有一个活动数据源,这是正确的方法吗?就我而言,我们为不同的客户端支持 2 个 dbms,但每个只支持 1 个服务器
  • 可能不会,不。您希望通过 Spring PropertyPlaceholderConfigurer 配置 JDBC URL。您可以从属性文件甚至环境变量中读取它。
  • 这就是我最后所做的。我指定了一个属性,用于选择哪个 bean 用作数据源。我发布了它here
猜你喜欢
  • 2014-07-24
  • 1970-01-01
  • 1970-01-01
  • 2011-04-20
  • 1970-01-01
  • 2012-10-15
  • 2012-01-21
  • 2021-09-09
  • 2010-11-06
相关资源
最近更新 更多