首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >OpenJpa批量插入

OpenJpa批量插入
EN

Stack Overflow用户
提问于 2019-03-20 15:34:02
回答 1查看 186关注 0票数 0

我已经读过thisthat了,但它不适合我。我有openjpa实现,我需要批量插入。我有一些实体,使用Spring,我从EntityManagerFactory注入了事务管理器和EntityManager,如下所示

代码语言:javascript
复制
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory"/>
</bean>

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="persistenceUnitName" value="JpaPersistenceUnit"/>
        <property name="jpaPropertyMap">
            <map>
                <entry key="openjpa.jdbc.DBDictionary" value="org.apache.openjpa.jdbc.sql.OracleDictionary" />
                <entry key="openjpa.ConnectionFactoryProperties" value="PrintParameters=true" />
            </map>
        </property>
    </bean>

在课堂上,我有

代码语言:javascript
复制
@PersistenceContext
protected EntityManager em;
AtomicInteger size = new AtomicInteger();

@TransactionalRollback
public void saveLogs(Logs log) {

int i = size.incrementAndGet();
int batchSize=100;
em.persist(log);
if(i%batchSize==0){

em.flush();
em.clear();
}
}

在这里,我不知道,我该怎么做。因为,如果我使用flush(),我会得到错误,我不能对共享的EntityManager做任何事情。当我只是持久化时,这是可以的,但是每个数据都会立即提交。

也许可以使用SpringBuilder和一些nativeQuery进行批量插入?喜欢

代码语言:javascript
复制
 String insert = "INSERT into SIEBEL_METHOD_LOGS (?1,?2,?3,?4) VALUES ";
    StringBuilder builder = new StringBuilder(insert);
        builder.append(
                "(" + log.getMethod() + "), "
                        + "(" + log.getClient() + "), "
                        + "(" + log.getStartDate() + "), "
                        + "(" + log.getResponseTime() + "), "
                        + "(" + log.getIsError() + ")");
            Query query = em.createNativeQuery(builder.toString());
            query.executeUpdate();

但是,我对此并不确定。

另外,我也不明白org.apache.openjpa.jdbc.sql.OracleDictionary has字段的含义

代码语言:javascript
复制
// batch limit
   private int defaultBatchLimit = 100;

它什么时候起作用?因为每当我持久化和结束我的方法时,我都会被刷新到DB中,而它并不依赖于我持久化到DB中的100或5个元素。他们会在那里的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-21 20:51:22

我使用了这个解决方案,但也许它可以更优雅

代码语言:javascript
复制
public class LoggerClass {
  private static final int batchSize = 100;
  private List<MethodsLog> logsList;
    private AtomicLong sizeList;

    private void initList() {
        this.logsList = new ArrayList<>(batchSize);
        this.sizeList = new AtomicLong();
    }
    public void saveLogs(MethodsLog log) {
        long i = sizeList.incrementAndGet();
        logsList.add(log.toJpa());
        if (i % batchSize == 0) {
            saveToDBAndClear(logsList);
            initList();
        }
    }

    private synchronized void saveToDBAndClear(List<MethodsLog> logs) {
        MethodsService.saveLogs(logs);
    }

    @TransactionalRollback
    public void saveLogs(List<MethodLogs> logs) {
        for (MethodLogs log : logs) {
            em.persist(log);
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55255599

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档