我在单独的.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;但我不明白那里的答案。
答案 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,这可能会引入其他问题。