有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java与springhibernate使用2种不同的数据库连接

我有两个单独的模块,分别在不同的位置。在2个不同数据库上运行的JAR

applicationContext-hibernate.xml文件包含会话工厂和web的唯一名称。xml加载(应该加载吗?我希望如此。)两者都是背景。xml文件。我还在web中定义了一个自定义sessionFactory名称。xml,正如您在这里看到的:

网络。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可用(当然,因为没有添加另一个)

我只找到了“How to handle multiple database connections using session factories with Spring and Hibernate”,但我不明白那里的答案


共 (5) 个答案

  1. # 1 楼答案

    由于您已经在使用spring和hibernate,如果使用JPA和hibernate映射,您可以在spring上下文xml中定义两个不同的实体管理器,并且在DAO层中注入实体管理器时,可以使用实体管理器名称进行注入。通过这种方式,您可以与多个数据库连接进行通信。我以前已经自己配置过了

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

  2. # 2 楼答案

    只要您定义了两个具有不同ID的SessionFactory。。可以传递第二个xml文件的路径,并用逗号分隔

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

    完成此设置后。。spring将能够初始化2个会话工厂

    -选项1

    您需要创建两个hibernateTemplate实例(每个会话工厂一个),并将它们都注入到DAO中,这样您就可以使用hibernateTemplate处理多个会话工厂

    -选项2

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

  3. # 3 楼答案

    如果您可以移动到Hibernate4,您可以检查Multi-tenancy in Hibernate,但这需要移动到Spring3.1,这可能会引入其他问题

  4. # 4 楼答案

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

    确保bean的名称是唯一的,例如每个SessionFactorybean都需要有唯一的ID,否则它们会相互覆盖

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

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

    如果两个模式在同一个数据库上,另一种选择是将Hibernate设置为连接到一个模式,并通过第一个模式访问第二个模式的表。您可以在Oracle中使用授权和同义词来实现这一点。这是您的选择,还是您真的需要连接到两个不同的数据库

  5. # 5 楼答案

    如果我理解正确的话,在类路径的两个jar中有两个同名(和包)的文件,希望类加载器能够同时加载这两个文件

    这是无法实现的:当要求ClassLoader按名称加载资源时,它会按顺序扫描其类路径中的所有JAR和目录,并返回找到的第一个同名资源

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