Hibernate + Spring使用多个数据源?

时间:2009-05-13 23:28:50

标签: java hibernate spring spring-mvc

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:25)

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

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

这使您的DataSource查找逻辑可以在一个地方处理。您的DAO层和SessionFactory不需要调整,除非您需要将AbstractRoutingDataSource的子类注入Hibernate SessionFactory。

答案 1 :(得分:8)

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

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

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