【发布时间】:2019-08-10 20:12:43
【问题描述】:
我已经阅读过this 和that 但它不适合我。 我有 openjpa 实现,我需要进行批量插入。 我有一些实体,使用 Spring 我从 EntityManagerFactory 注入我的事务管理器和 EntityManager,例如
<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>
我在课堂上
@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() 会出现错误,我无法对 Shared EntityManager 做任何事情。当我只坚持时,没关系,但每个数据都会立即提交。
也许可以使用 SpringBuilder 和一些 nativeQuery 进行批量插入? 喜欢
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 有字段
// batch limit
private int defaultBatchLimit = 100;
什么时候生效?因为每当我坚持并结束我的方法时,我都会刷新到 DB 中,它不依赖于我坚持到 DB 中的 100 或 5 个元素。他们会在那里。
【问题讨论】: