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

questionAnswers(6)

yourAnswerToTheQuestion