最近在優化公司的系統的時候mysql數據庫採用了讀寫分離策略,同樣的sessionFactory要配置兩個,但原有的項目中大量應用了hibernate的延時加載,在調試的時候才發現,無論如何都不能同時實現兩個sessionFactory的延時加載,後來通過翻閱資料和閱讀源碼,終於找到了解決方案:
兩個sessionFactory的在spirng配置如下:
<bean
id="sessionFactoryAssist"
class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="configurationClass">
<value>com.landray.kmss.sys.config.loader.HibernateConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSourceAssist" />
</property>
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
</bean>
<bean
id="sessionFactory"
class="com.landray.kmss.sys.config.loader.KmssHibernateLocalSessionFactoryBean">
<property name="configurationClass">
<value>com.landray.kmss.sys.config.loader.HibernateConfiguration</value>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">
${hibernate.dialect}
</prop>
</props>
</property>
<property name="dataSource">
<ref bean="dataSource" />
</property>
<property name="lobHandler">
<ref bean="oracleLobHandler" />
</property>
</bean>
在web.xml中配置兩個hibernate filter,分別管理這兩個sessionFactory,來實現延時加載:
<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>sessionFactory</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
<filter>
<filter-name>hibernateFilterAssist</filter-name>
<filter-class>
org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactoryAssist</param-value>
</init-param>
<init-param>
<param-name>singleSession</param-name>
<param-value>true</param-value>
</init-param>
<init-param>
<param-name>flushMode</param-name>
<param-value>AUTO</param-value>
</init-param>
</filter>
至此,兩個sessionFactory均可以實現延時加載了。