Hibernate + Spring 使用多个数据源?

Posted

技术标签:

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

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

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

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

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

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

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

【问题讨论】:

这个问题和这个问题非常相似:***.com/questions/281247/… 【参考方案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

以上是关于Hibernate + Spring 使用多个数据源?的主要内容,如果未能解决你的问题,请参考以下文章

我可以使用 Spring/Hibernate/c3p0 为多个数据库使用一个池数据源吗?

使用带有 Spring 和 Hibernate 的会话工厂处理多个数据库连接

如何使用 Hibernate、Spring MVC 将数据从单个表单发送到多个数据库表

使用 Spring 和 Hibernate 跨多个数据库进行分布式事务的“最佳”方法是啥

为多个数据库关系配置 Hibernate-Spring 的最佳实践是啥?

如何通过使用 JPA + Hibernate 和 Spring-boot 在一个数据库中使用多个模式?