使用spring-hibernate的2个不同的数据库连接

时间:2012-02-23 14:40:00

标签: java hibernate spring

我在单独的.jars中有2个单独的模块,它们在2个不同的数据库上运行。

applicationContext-hibernate.xml文件包含会话工厂的唯一名称,并且web.xml加载(应该加载?我希望如此。)两个context.xml文件。我还在web.xml中定义了一个自定义sessionFactory名称,如下所示:

的web.xml

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath*:/applicationContext-hibernate.xml</param-value>
</context-param>
[...]
<filter>
    <filter-name>hibernateFilter</filter-name>
    <filter-class>
        org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
    </filter-class>
    <init-param>
        <param-name>sessionFactoryBeanName</param-name>
        <param-value>customsessionFactory</param-value>
    </init-param>
</filter>

因此第一个数据库连接按预期工作。但是我该如何添加第二个呢? 上下文中只有一个数据库bean可用(当然,因为没有添加另一个)

我只找到&#34; How to handle multiple database connections using session factories with Spring and Hibernate&#34;但我不明白那里的答案。

5 个答案:

答案 0 :(得分:4)

只要您定义了具有不同ID的2个sessionFactories ..您可以传递第二个xml文件的路径,用逗号分隔它

<param-value>classpath*:/applicationContext-hibernate.xml, <<2nd file reference>></param-value>

一旦你有了这个设置.. spring将能够初始化2 sessionFactories ..

- 选项1

你需要创建2个hibernateTemplate实例(每个会话工厂一个)并将它们注入你的DAO,这样你就可以使用hibernatetemplate来处理多个sessionFactories ..

- 选项2

在使用HibernateDaoSupport时,您可以使用方法createHibernateTemplate(sesionFactoryReference)创建具有特定sessionFactory的模板对象。

答案 1 :(得分:3)

如果我理解正确,你在类路径中的两个jar中有两个具有相同名称(和包)的文件,并希望ClassLoader将同时加载它们。

无法实现此功能:当要求ClassLoader按名称加载资源时,它会按顺序扫描其类路径中的所有jar和目录,并返回使用此名称找到的第一个资源。

您必须使用不同的名称(或包)命名您的上下文文件,并将它们加载。如果您希望在视图中打开两个会话,则还必须声明两个不同的过滤器。

答案 2 :(得分:2)

因为你已经使用了spring和hibernate,如果你使用JPA和hibernate映射,你可以在spring上下文xml中定义2个不同的实体管理器,当你在DAO层中注入实体管理器时,你可以使用实体注入经理姓名。这样您就可以与多个数据库连接进行通信。我以前自己配置了这个。

以下是我在网上搜索的链接,但这正是我所做的 http://viralpatel.net/blogs/2011/01/spring-roo-two-database-configuration.html

答案 3 :(得分:1)

使用Spring执行此操作的常用方法是拥有多个上下文文件。如果您想确保找到它们,请将它们放在不同的包中。

确保您的bean名称唯一,例如每个SessionFactory bean都需要具有唯一ID,否则它们将相互覆盖。

这里有一个提示,可以找出它们是否由Spring加载和构建:打开Spring的调试级别的日志记录(例如,在 Log4J 中),Spring将显示它加载和构造的文件和bean 。这真的很有帮助。

如果要在同一事务中使用两个数据源,请确保使用的是TransactionManager,最好也是XA(两阶段提交)。在处理多个数据源时,我通常让Spring在服务层提供事务划分。在服务方法内部,一切都在同一个事务中运行,我可以在那里使用多个数据源。

如果两个模式位于同一个数据库上,则另一种方法是将Hibernate设置为连接到一个模式,并通过第一个模式访问第二个模式的表。您可以使用授权和同义词在Oracle中执行此操作。这是你的选择,还是你真的需要连接到两个不同的数据库?

答案 4 :(得分:1)

如果你可以转到Hibernate 4,你可以检查Multi-tenancy in Hibernate,但这需要转移到Spring 3.1,这可能会引入其他问题。