如何解决创建实现 Runnable 的新线程,以使用 JPA/Hibernate 提高批量插入 Oracle 的性能
我目前在使用 EntityManager 提供的 executeUpdate() 方法向 oracle 插入数据时遇到速度缓慢的问题。我的应用程序在给定时间可能有几十万条记录要插入到 Oracle 中,我正在努力使性能尽可能快速/高效。我的想法是一次为 5000 条记录实现 Runnable,这样我就可以为每个 5000 条记录执行并发线程。我不确定如何实现这一点,但我认为能够使用 Hibernate/JPA 将批量数据插入到 Oracle 中。
这是我的 DAO 方法,它在我循环传递的列表中保留数据:
public void insertPromoData(List<InsertPromoData> insertData) {
EntityManager em = emf.createEntityManager();
try {
//EntityManager em = emf.createEntityManager();
System.out.println("Beginning insertPromoData at " + System.currentTimeMillis());
em.getTransaction().begin();
int count = 0;
int sequenceCount = 0;
Query query = em.createNativeQuery(env.getProperty("insertPromoUploadData"));
if (!(getMaxSequenceNum() == null)) {
sequenceCount = getMaxSequenceNum().intValue() + 1;
}
else {
sequenceCount = 1;
}
for (InsertPromoData promoData : insertData) {
query.setParameter("id",(new Long(sequenceCount)));
query.setParameter("item",promoData.getItem());
query.setParameter("location",promoData.getLoc());
query.executeUpdate();
++count;
++sequenceCount;
if (count > 0 && count % 1000 == 0) {
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
}
}
em.getTransaction().commit();
}
catch(Exception e) {
logger.error("Exception in beginning transaction");
e.printStackTrace();
}
finally {
em.clear();
em.close();
}
logger.debug("Execution of method insertPromoData in Dao ended");
}
这是我正在执行的查询(来自属性文件):
insertPromoUploadData = INSERT INTO SCHEMA.PROMO (SEQ_NUM,ITEM,LOC,U_TIMESTAMP) VALUES (:id,:item,:location,SYSDATE)
getMaxPromoValue = SELECT MAX(SEQ_NUM) FROM SCHEMA.PROMO
我的实体:
@Entity
@Table(name = "U_USER_PROMO")
public class InsertPromoData {
@Id
@Column(name="SEQ_NUM")
Long id;
@Column(name="ITEM")
String item;
@Column(name="LOC")
String loc;
//getters and setters
我虽然在开始时实现了一个新线程:
if (count > 0 && count % 1000 == 0) {
em.getTransaction().commit();
em.clear();
em.getTransaction().begin();
}
关于如何执行此操作或提高插入性能的任何建议? 9000 条记录需要 7-8 分钟,这太慢了。我不确定是什么导致了这种缓慢。任何帮助表示赞赏。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。