2014-01-22 2 views
3

SpringFramework 3과 Hibernate 4와 MySQL 5를 jpa와 함께 사용하고 있습니다. 내 테스트 코드는 내가 그것을 불 대신 쿼리 1000 번 삽입합니다 내 코드를 실행 호출Hibernate JDBC 배치 크기가 작동하지 않습니다.

@Repository 
public class TestRepositoryImpl implements TestRepository { 

    @PersistenceContext 
    private EntityManager em; 

    @Override 
    @Transactional 
    public void insertBulk() { 
    Item it; 
    for(int i= 0; i<1000;i++) { 
     it = new Item(); 
     it.setPrice(Math.random()*100); 
     em.persist(it); 
    } 
    } 
} 

내 스프링 구성

<bean id="entityManagerFactory" 
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="application" /> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<tx:annotation-driven transaction-manager="transactionManager" /> 

내 persistence.xml을

<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd" 
version="1.0"> 

<persistence-unit name="application" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>com.springapp.test.domain.Item</class> 
    <class>com.springapp.test.domain.Order</class> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <property name="hibernate.show_sql" value="true" /> 
     <property name="hibernate.format_sql" value="false" /> 
     <property name="hibernate.connection.driver_class" value="com.mysql.jdbc.Driver" /> 
     <property name="hibernate.connection.url" value="jdbc:mysql://localhost:3306/testdb" /> 
     <property name="hibernate.connection.username" value="root" /> 
     <property name="hibernate.connection.password" value="" /> 
     <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect" /> 
     <property name="hibernate.hbm2ddl.auto" value="update" /> 
     <property name="hibernate.jdbc.batch_size" value="20" /> 
    </properties> 
</persistence-unit> 

</persistence> 

...처럼 보이는 50 삽입 쿼리를 실행 중입니다. 이슈가 뭐야? 최대 절전 모드를 사용하여 jpa로 배치 삽입을 도와주세요

+0

친절 스택 tracce –

+0

죄송합니다 ... 예외 또는이 코드에서 오류가 없습니다 추가 링크를 확인하십시오. 코드는 잘 작동하지만 콘솔에서는 1000 번 insert 쿼리를 인쇄합니다. – Mitesh

답변

1

"배치 크기"를 잘못 이해했습니다. 일괄 처리 크기는 코드가 쿼리를 실행하는 것처럼 각 쿼리를 보내는 대신 "일괄 처리 크기"의 쿼리를 한 번에 보낼 수 있음을 의미합니다. 따라서이 경우 1000 개의 삽입 쿼리가 있으며 각 배치에 20 개의 삽입 쿼리가있는 50 개의 쿼리가 전송됩니다.

+0

이렇게하고 싶습니다 [link] (http://stackoverflow.com/questions/6687422/hibernate-batch-size-confusion?answertab=votes#tab-top) – Mitesh

4

삽입 테이블의 기본 키가 GenerationType.Identity 인 경우 Hibernate는 JDBC 레벨에서 삽입 배치를 투명하게 비활성화합니다.

save()는 하나의 레코드 만 처리 한 다음 flush()하므로 모든 플러시에 대해 처리 할 추가 INSERT SQL이 하나만 있습니다. 그래서 Hibernate는 처리 할 INSERT SQL이 하나 밖에 없기 때문에 배치를 삽입하는 것을 도와 줄 수 없다. 모든 save()에 대해 flush()를 호출하는 대신 flush()를 호출하기 전에 일정량의 레코드까지 저장해야합니다.

Session session = sessionFactory.openSession(); 
Transaction tx = session.beginTransaction(); 
for (int i=0; i<888888; i++) { 
    TableA record = new TableA(); 
    record.setXXXX(); 
    session.save(record) 
    if (i % 50 == 0) { //50, same as the JDBC batch size 
     //flush a batch of inserts and release memory: 
     session.flush(); 
     session.clear(); 
    } 
} 
tx.commit(); 
session.close(); 

당신은 저장 및 배치에 의해 기록 배치를 플러시 :

배치 삽입의 가장 좋은 방법은이 같은 것입니다. 각 배치의 끝에서 모든 영구 객체가 첫 번째 레벨 캐시 (JVM의 메모리)에 배치 될 때 메모리 고갈을 막기 위해 일부 메모리를 해제하기 위해 지속성 컨텍스트를 지워야합니다. 불필요한 오버 헤드를 줄이기 위해 2 차 수준 캐시를 비활성화 할 수도 있습니다.

친절 http://docs.jboss.org/hibernate/orm/3.5/reference/en/html/batch.html

+0

코드 조각이 정상적으로 작동합니다. 하지만이 코드는 최대 절전 모드의 특정 코드라고 생각합니다. 최대 절전 모드와 관련이없는 jpa를 사용하고 싶습니다. 내 jpa는 최대 절전 모드, eclipselink 또는 openjpa의 공급자 중 하나 일 수 있습니다. – Mitesh

+1

http://stackoverflow.com/questions/2773302/jpa-hibernate-bulkbatch-insert 친절하게 이것을 확인하십시오 https://access.redhat.com/site/documentation/en-US/JBoss_Enterprise_Application_Platform/5/html/Performance_Tuning_Guide/sect -Performance_Tuning_Guide-Entity_Beans-Batch_Inserts.html –

관련 문제