Hibernate + Spring使用多个数据源?

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

该应用程序的一个要求是它必须能够将一些对象导出到外部数据库。 我想我也可以使用我现有的数据层,只需将对象保存到外部源。

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

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

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

我想我不需要回答上述问题,特别是如果有人能够指导我完成这样的工作的基本过程。 谢谢!

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

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

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

在spring上下文中配置多个数据源和会话工厂本身不是问题,但它确实使自动assembly不那么有吸引力。

您可以使用@Qualifier注释告诉自动assembly选择哪一个,但我建议不使用自动assembly,而是使用显式地注入正确的数据源和会话工厂。

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