2012-02-23 53 views
2

我有兩個單獨的模塊在單獨的.jars中操作2個不同的數據庫。使用2個不同的數據庫連接和spring-hibernate

applicationContext-hibernate.xml文件包含會話工廠的唯一名稱,並且web.xml加載(應該加載?我希望是這樣)兩個context.xml文件。我還定義了自定義的sessionFactory namesin web.xml中的一個,因爲你岑在這裏看到:

的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> 

所以如預期的第一個數據庫連接的工作原理。但我該如何添加第二個? 只有數據庫豆的一個可從上下文(當然,因爲另一種是不加)

我只找到「How to handle multiple database connections using session factories with Spring and Hibernate」,但我不明白的答案在那裏。

回答

4

只要你定義了2個sessionFactories用不同的ID ..你可以通過第二個路徑xml文件用逗號

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

一旦有了這種設置..春天就能初始化2個sessionFactories ..

它分隔條件 - 選擇1

你需要創建的HibernateTemplate(每個會話一個廠)的2個實例並把它們注入到你的DAO,這樣你可以使用的HibernateTemplate多個sessionFactories工作..

- 選項2

在使用HibernateDaoSupport時,可以使用方法createHibernateTemplate(sesionFactoryReference)創建具有特定sessionFactory的模板對象。

3

如果我理解正確,在類路徑的兩個jar中有兩個具有相同名稱(和包)的文件,並且希望ClassLoader能同時加載這兩個文件。

這種方法沒有辦法工作:當ClassLoader被要求通過名稱加載資源時,它按順序掃描其classpath中的所有jar和目錄,並返回找到的第一個使用該名稱的資源。

您必須使用不同的名稱(或包)命名您的上下文文件,並加載它們。如果您希望打開兩個會話,您還需要聲明兩個不同的過濾器。

+0

謝謝,這可能會有所幫助。我可以簡單地設置兩個'context-param'條目(在'param-value'中有不同的名字嗎?當聲明2個過濾器時,它們是否必須是相同的名稱('hibernateFilter')? – brandstaetter 2012-02-27 11:53:29

+0

不,上下文的名稱-parame必須是唯一的,你必須在param-value中列出用逗號分隔的兩個文件,過濾器的名稱也必須是唯一的,選擇你想要的名字 – 2012-02-27 12:24:26

+0

謝謝,我會試試! – brandstaetter 2012-02-29 04:26:00

1

通常的做法是使用Spring來創建多個上下文文件。如果您想確保找到兩者,請將它們放入不同的包中。

確保您的豆子是唯一命名的,例如每個SessionFactory bean都需要有唯一的ID,否則它們會互相覆蓋。下面是一個提示,瞭解它們是否被Spring加載和構建:打開Spring的調試級別(例如,在Log4J),Spring將顯示它加載和構建的文件和bean。這真的很有幫助。

如果兩個數據源要在同一個事務中使用,請確保您使用的是TransactionManager,最好也是XA(兩階段提交)。在處理多個數據源時,我通常會在服務層提供事務劃分。在服務方法內部,所有內容都在同一個事務中運行,並且我可以在那裏使用多個數據源。

如果兩個模式都在同一個數據庫上,另一種方法是設置Hibernate連接到一個模式並通過第一個模式訪問第二個模式的表。你可以在Oracle中使用授權和同義詞來實現。這是您的選擇,還是您真的需要連接到兩個不同的數據庫?

2

因爲您已經使用了spring和hibernate,如果您使用JPA和hibernate映射,您可以在spring context xml中定義2個不同的實體管理器,並且當您在DAO層注入實體管理器時,可以使用實體經理的名字。這樣您可以與多個數據庫連接進行通信。我以前自己配置過這個。

下面是我得到了搜索網站的鏈接,但是這是我究竟做了 http://viralpatel.net/blogs/2011/01/spring-roo-two-database-configuration.html

1

如果你可以轉移到休眠4,你可以檢查Multi-tenancy in Hibernate但這需要移動到Spring 3.1,這可能會引入其他問題。

+0

謝謝,我會檢查一下,我相信我不久就要搬到H4和S3.1。 – brandstaetter 2012-03-04 09:09:07

相關問題