15

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

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

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

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

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

我想我不需要回答上述问题,如果有人可以引导我完成让这样的事情起作用的基本过程。谢谢!

4

2 回答 2

25

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

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

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

于 2009-05-15T05:51:06.550 回答
8

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

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

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

于 2009-05-14T10:15:34.600 回答