gpt4 book ai didi

java - 如何使用 session 工厂提高批量插入的性能

转载 作者:行者123 更新时间:2023-11-30 09:29:00 25 4
gpt4 key购买 nike

我使用 seam 将 jpa 与 hibernate 一起使用。我需要一次插入 200,000 条记录。

这是我的代码:

hibernate .cfg.xml

<hibernate-configuration>
<session-factory name="java:/mobeeSessionFactory">
<property name="hibernate.connection.pool_size">10</property>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:mobee</property>
<property name="hibernate.connection.username">mobeemigrate</property>
<property name="hibernate.connection.password">mobeemigrate</property>
<property name="hibernate.show_sql">false</property>
<property name="hibernate.dialect">org.hibernate.dialect.OracleDialect</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<property name="hibernate.session_factory_name">java:/mobeeSessionFactory</property>
<property name="hibernate.connection.datasource">mobeeadminDataSource</property>
<property name="hibernate.jdbc.batch_size">10000</property>
<property name="hibernate.cache.use_first_level_cache">true</property>
<property name="hibernate.cache.use_second_level_cache">false</property>
<property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
<property name="hibernate.transaction.factory_class">org.hibernate.transaction.JTATransactionFactory</property>
<property name="hibernate.transaction.auto_close_session">false</property>
<property name="hibernate.cache.provider_class">org.hibernate.cache.HashtableCacheProvider</property>
<property name="hibernate.transaction.flush_before_completion">true</property>

<!-- Here are the mappings -->
<mapping package="com.manam.mobee.persist.entity"/>
<mapping class="com.manam.mobee.persist.entity.TempCustomers"/>
<mapping class="com.manam.mobee.persist.entity.TempAccounts"/>
</session-factory>

组件.xml

<persistence:hibernate-session-factory name="hibernateSessionFactory" cfg-resource-name="hibernate.cfg.xml"/>
<persistence:managed-hibernate-session name="session"
auto-create="true"
session-factory-jndi-name="java:/mobeeSessionFactory"/>

示例代码:

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

for(int i=0;i<doTempAccounts.size();i++){

try {
TempAccounts temp=new TempAccounts();

BeanUtils.copyProperties(temp, doTempAccounts.get(i));

session.save(temp);

if ( i % 10000 == 0 ) { //10000, same as the JDBC batch size
//flush a batch of inserts and release memory:
log.info("********** Batch Updates**********");
session.flush();
session.clear();
}
}
}
tx.commit();
session.close();

上面的代码可以正常工作,但插入 200,000 条记录大约需要 10 分钟。我的代码中是否有任何配置可以提高批量插入的性能?

在上面的代码中,我每 10000 条记录执行一次 session.flush() 但不是每次都插入数据库。您能解释一下如何对 db. 执行批量插入吗?

最佳答案

了解 StatelessSession 以及如何使用它向您的数据库中插入项目。这似乎是问这个问题时的答案,我个人只是用它在大约 15 秒内完成了 15 分钟的工作。它并不适合所有场景,但如果适合,效果会很好。

关于java - 如何使用 session 工厂提高批量插入的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13772953/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com