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”,但我不明白那里的答案
# 1 楼答案
由于您已经在使用spring和hibernate,如果使用JPA和hibernate映射,您可以在spring上下文xml中定义两个不同的实体管理器,并且在DAO层中注入实体管理器时,可以使用实体管理器名称进行注入。通过这种方式,您可以与多个数据库连接进行通信。我以前已经自己配置过了
下面是我在网上搜索得到的一个链接,但这正是我所做的 http://viralpatel.net/blogs/2011/01/spring-roo-two-database-configuration.html
# 2 楼答案
只要您定义了两个具有不同ID的SessionFactory。。可以传递第二个xml文件的路径,并用逗号分隔
完成此设置后。。spring将能够初始化2个会话工厂
-选项1
您需要创建两个hibernateTemplate实例(每个会话工厂一个),并将它们都注入到DAO中,这样您就可以使用hibernateTemplate处理多个会话工厂
-选项2
使用HibernateDataOSupport时,可以使用方法
createHibernateTemplate(sesionFactoryReference)
创建具有特定sessionFactory的模板对象# 3 楼答案
如果您可以移动到Hibernate4,您可以检查Multi-tenancy in Hibernate,但这需要移动到Spring3.1,这可能会引入其他问题
# 4 楼答案
使用Spring执行此操作的通常方法是使用多个上下文文件。如果您想确保两者都找到了,请将它们放在不同的包中
确保bean的名称是唯一的,例如每个
SessionFactory
bean都需要有唯一的ID,否则它们会相互覆盖这里有一个提示,用于确定它们是否由Spring加载和构造:打开Spring调试级别的日志记录(例如在Log4J中),Spring将显示它加载和构造的文件和bean。这真的很有帮助
如果两个数据源要在同一事务中使用,请确保您使用的是TransactionManager,最好也是XA(两阶段提交)。在处理多个数据源时,我通常让Spring在服务层提供事务划分。在服务方法内部,所有内容都在同一事务中运行,我可以在那里使用多个数据源
如果两个模式在同一个数据库上,另一种选择是将Hibernate设置为连接到一个模式,并通过第一个模式访问第二个模式的表。您可以在Oracle中使用授权和同义词来实现这一点。这是您的选择,还是您真的需要连接到两个不同的数据库
# 5 楼答案
如果我理解正确的话,在类路径的两个jar中有两个同名(和包)的文件,希望类加载器能够同时加载这两个文件
这是无法实现的:当要求ClassLoader按名称加载资源时,它会按顺序扫描其类路径中的所有JAR和目录,并返回找到的第一个同名资源
您必须使用不同的名称(或包)命名上下文文件,并同时加载它们。如果希望在视图中打开两个会话,则还必须声明两个不同的筛选器