最近在优化公司的系统的时候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均可以实现延时加载了。