Sessões de anotação da mola hibernada não sendo fechadas / liberadas
Eu 'herdei' um projeto que usa anotações do Spring para gerenciar transações / sessões com o Hibernate. Ou pelo menos deve ser. Atualmente, as sessões do Hibernate nunca são liberadas (elas são definidas como FLUSH_MODE_NEVER) e os DAO precisam ser liberados manualmente para que todos os dados sejam gravados no banco de dado
Também todos os objetos DTO permanecem residentes na memória do hibernate, levando eventualmente a um erro OutOfMemor
Creio que preciso informar ao Spring / Hibernate para fechar a sessão ou confirmar a transação. Na minha classe de controlador, tenho o método anotado para lidar com as solicitações:
@Transactional(propagation = Propagation.REQUIRED, rollbackFor = Exception.class)
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
...
...
}
e no arquivo applicationContetxt.xml, acredito que configurei o gerenciador de transações do hibernate e diga ao spring para usar as anotações:
<!-- 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" />
Não só tenho certeza de que a configuração está incorreta pelo modo como os dados não são gravados no banco de dados sem chamar manualmente o flush em cada um dos DAO, a partir do arquivo de log, podemos ver que o gerenciador de transações está com o flushing e o encerramento da sessão Desativado
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
O que precisa ser feito para que o Spring / hibernate libere automaticamente os DAOs e / ou feche a sessão para impedir que grandes quantidades de memória sejam usadas pelo Hibernate?
cheers 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>