【 使用环境 】生产环境
【 OB or 其他组件 】ob
【 使用版本 】4.0
【问题描述】
jpa批量插入的引擎,看网上找的资料要求是InnoDB
ob数据库的引擎是oceanbase,操作表修改引擎也是无法操作的。
这样的话是不是jpa执行批量插入,在ob就无法实现了那?
代码如下:
连接mysql数据库执行插入,应该是批量执行的。
连接ob数据库,同样的配置和代码,应该是一条条执行。
【 使用环境 】生产环境
【 OB or 其他组件 】ob
【 使用版本 】4.0
【问题描述】
jpa批量插入的引擎,看网上找的资料要求是InnoDB
ob数据库的引擎是oceanbase,操作表修改引擎也是无法操作的。
这样的话是不是jpa执行批量插入,在ob就无法实现了那?
代码如下:
可以帮忙提供一个完整一点的demo project吗, 比较好验证一下。
核心代码就是使用jpa方式进行插入数据,因数据量大想实现批量插入。
csv文件插入
dataListCsv为读入的csv文件
pppoeUserHistoryDao.batchInsertAndUpdate(dataListCsv);
@Repository
public class PppoeUserHistoryDao {
@PersistenceContext
private EntityManager entityManager;
@Transactional(rollbackFor = Exception.class)
public void batchInsertAndUpdate(List list) {
int size = list.size();
for (int i = 0; i < size; i++) {
// 每1000条数据执行一次,或者最后不足1000条时执行
if (i>0&& (i % 1000 == 0 || i==(size-1))) {
System.out.println("============================"+i);
entityManager.flush();
entityManager.clear();
}
entityManager.persist(list.get(i));
}
entityManager.flush();
entityManager.clear();
}
}
没有特殊的代码,能配置的也已经配置了。
好的,我稍后验证下,可以直接使用jdbc的方式吗,还是一定要用jpa的方式
jdbc和mybatis都好使,我们公司习惯是jpa,麻烦了
参考这个程序做了一下测试,然后从OceanBase的 sql 记录中可以看出来,确实是按照batchSize拼成一条sql写入的。
rewriteBatchedStatements=true
其他一些参数应该不是关键的参数,可以参考git链接中的配置
好的,我参考测试下,麻烦了
老师,按您说的这个写法确实可以执行批量导入了,可是太慢了啊,慢的夸张。。。
能看一下是OB执行的慢,还是应用比较慢吗,可以查一下OB的v$ob_sql_audit表,里面应该有执行时间的
这个看起来是插入一条数据
主要看下这个时间 ELAPSED_TIME,以及后面几个xxx_time的具体阶段的统计项
这一条的 ELAPSED_TIME: 922, 是922us,
可以筛选一下ELAPSED_TIME比较大的记录
老师,我这边看了下记录,并未像您的截图一样。insert value多条数据,我看都是单条执行。
其他参数的设置呢,spring.jpa.properties.hibernate.jdbc.batch_size 有设置吗
这一条是查询sql_audit表的,并不是插入的
SELECT MAX(ELAPSED_TIME),* FROM GV$OB_SQL_AUDIT WHERE QUERY_SQL like ‘%insert into widenetwork.pppoe_User_x%’
这个写法有问题吗?不是查询插入的最大时长的吗
把like中前面的%去掉吧,因为查询GV$OB_SQL_AUDIT表的sql也会记录到这个表里面
是的,这个有1519us,1.5ms 左右,但是还得确认下为什么没有一次写入多行,spring.jpa.properties.hibernate.jdbc.batch_size 有设置吗,其他一些参数的设置是怎样的