【发布时间】:2012-01-31 00:19:55
【问题描述】:
我“继承”了一个项目,该项目使用 Spring 注释来管理 Hibernate 的事务/会话。或者至少它是注定的。目前,Hibernate 会话永远不会被刷新(它们被设置为 FLUSH_MODE_NEVER),并且需要手动刷新 DAO 才能将任何数据写入数据库。
此外,所有 DTO 对象都驻留在 hibernate 的内存中,最终导致 OutOfMemory 错误。
我相信我需要告诉 Spring/Hibernate 关闭会话或提交事务。在我的控制器类中,我有处理请求的注释方法:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
...
...
}
在 applicationContetxt.xml 文件中,我相信我设置了休眠事务管理器并告诉 spring 使用注释:
<!-- hibernate3 transaction manager -->
<bean id="transactionManagerLocal" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="dataSource" ref="${local.data.source}" />
<property name="sessionFactory" ref="localSessionFactory" />
</bean>
<!-- Demarcate using @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManagerLocal" order="200" />
我不仅很确定配置是错误的,因为在没有手动调用每个 DAO 上的刷新的情况下数据不会写入数据库,从日志文件中我们可以看到事务管理器正在刷新并且会话关闭禁用:
INFO [http-8080-2] TransactionFactoryFactory - Transaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory
INFO [http-8080-2] TransactionManagerLookupFactory - No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended)
INFO [http-8080-2] SettingsFactory - Automatic flush during beforeCompletion(): disabled
INFO [http-8080-2] SettingsFactory - Automatic session close at end of transaction: disabled
需要做什么才能使 Spring/hibernate 自动刷新 DAO 和/或关闭会话以防止 Hibernate 使用大量内存?
干杯 丹
<!-- MySQL/InnoDB session factory -->
<bean id="localSessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="${local.data.source}"/>
<property name="mappingResources">
<list>
<value>net/company/projectname/domain/ExchangeRate.hbm.xml</value>
<!-- Other -->
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</prop>
<prop key="hibernate.connection.zeroDateTimeBehavior">convertToNull</prop>
<!--
DOES NOTHING
<prop key="hibernate.transaction.flush_before_completion">true</prop>
<prop key="hibernate.transaction.auto_close_session">true</prop>
-->
</props>
</property>
</bean>
<!-- hibernate3 transaction manager -->
<bean id="transactionManagerLocal" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="dataSource" ref="${local.data.source}" />
<property name="sessionFactory" ref="localSessionFactory" />
</bean>
<!-- Demarcate using @Transactional annotation -->
<tx:annotation-driven transaction-manager="transactionManagerLocal" order="200" />
<bean id="exchangeRateDAO" class="net.company.project.dao.hibernate.impl.ExchangeRateDAOImpl">
<property name="sessionFactory" ref="localSessionFactory"/>
</bean>
【问题讨论】:
-
顺便说一句,我尝试将
true true 添加到配置文件。虽然它现在说启用了自动刷新和会话关闭,但如果不手动刷新 DAO,仍然没有数据写入数据库。
标签: hibernate spring session annotations