nserções do @Batch com Hibernate & Spring
aplicativo @My é baseado no Hibernate 3.2 e Spring 2.5. Aqui está o snippet relacionado ao gerenciamento de transações no contexto do aplicativo:
<tx:annotation-driven transaction-manager="txManager"/>
<bean id="txManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
<property name="nestedTransactionAllowed" value="true"/>
</bean>
<bean id="transactionTemplate" classs="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="txManager"/>
</bean>
<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:/hibernate.cfg.xml"></property>
</bean>
Para todos os DAOs, há classe de serviço relevante e as transações são manipuladas usando@Transactional
em cada método na camada de serviço. No entanto, existe um cenário agora que um método no DAO diz "parse ()" é chamado a partir da camada de serviço. Na camada de serviço, especifiquei@Transactional(readOnly=false)
. Esse método de análise no DAO chama outro método, como "save ()" no mesmo DAO, que armazena um grande número de linhas (cerca de 5000) no banco de dados. Agora, o método save é chamado em um loop a partir da função de análise. Agora, o problema é que, após cerca de 100 chamadas para o método "save", às vezes recebo uma exceção OutOfMemory ou às vezes o programa para de responde
or enquanto, estas são as alterações que eu fiz no método sav
Session session = getHibernateTemplate().getSessionFactory().openSession();
Transaction tx = session.beginTransaction();
int counter = 0;
if(books!=null && !books.isEmpty()){
for (Iterator iterator = books.iterator(); iterator
.hasNext();) {
Book book = (Book) iterator.next();
session.save(book);
counter++;
if(counter % 20==0) {
session.flush();
session.clear();
}
}
}
tx.commit();
session.close();
Este é o único método no meu aplicativo em que inicio uma transação como essa e a confirma no final do método. Caso contrário, eu normalmente chamogetHibernateTemplate.save()
. Não tenho certeza se devo executar o gerenciamento de transações para esse método de salvar separadamente no DAO, colocando@Transactional(readOnly=false, PROPOGATION=NEW)
emsave()
, ou esta abordagem está correta?
Também atualizei ohibernate.jdbc.batch_size
a 20 no arquivo de configuração hibernate.cf
Alguma sugestão