0

ジャバコード:

EntityManager em1 = entityService.getEntityManager();
Query qury1 = em1.createNamedQuery(Constants.UNPROCESSED_CONTACTS);
List<Contact> contacts =  entityService.findByNamedQuery(qury1);

ここにすべての連絡先のリストがあり、すべての連絡先を100のバッチで追加したいと思います.hibernate 4とspring 3.1を使用しています私のapplicationContextは

 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
 </bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager"
    id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

どうすればさらに進むことができますか。前もって感謝します。

4

2 に答える 2

1

JPA 自体はバッチ挿入機能を提供しませんが、hibernate は提供します。私はあなたがすでにsessionFactory豆を持っているのを見ます。したがって、休止状態のドキュメントの例に従うことができます。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();
于 2013-01-02T07:00:25.487 に答える
0

参照: https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html

一括挿入の場合:

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
         session.flush();
       session.clear();
   }
}

tx.commit();
session.close();

そして、休止状態の XML 構成では:

<entry key="hibernate.jdbc.batch_size">50</entry>

これらを一緒に行うと、以前のタイプよりもはるかに速く挿入できます。

于 2014-12-15T11:14:33.490 に答える