Я «унаследовал» проект, который использует аннотации Spring для управления транзакциями / сеансами в Hibernate. Или, по крайней мере, так и должно быть. В настоящее время сеансы Hibernate никогда не сбрасываются (они установлены на FLUSH_MODE_NEVER), и DAO необходимо очищать вручную для любых данных, которые будут записаны в базу данных.
Также все объекты DTO остаются в памяти гибернации, что в конечном итоге приводит к ошибке 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 огромных объемов памяти?
веселит
Dan
<!-- 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>