jpa与ob数据库的兼容性

【 使用环境 】生产环境
【 OB or 其他组件 】ob
【 使用版本 】4.0
【问题描述】
jpa批量插入的引擎,看网上找的资料要求是InnoDB
ob数据库的引擎是oceanbase,操作表修改引擎也是无法操作的。
这样的话是不是jpa执行批量插入,在ob就无法实现了那?
代码如下:


连接mysql数据库执行插入,应该是批量执行的。
连接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的插入方式,是可以实现批量导入。

好的,我稍后验证下,可以直接使用jdbc的方式吗,还是一定要用jpa的方式

jdbc和mybatis都好使,我们公司习惯是jpa,麻烦了

参考这个程序做了一下测试,然后从OceanBase的 sql 记录中可以看出来,确实是按照batchSize拼成一条sql写入的。


代码上应该没有太大的差异,看起来关键的参数是连接参数中要设置

rewriteBatchedStatements=true

其他一些参数应该不是关键的参数,可以参考git链接中的配置

好的,我参考测试下,麻烦了

老师,按您说的这个写法确实可以执行批量导入了,可是太慢了啊,慢的夸张。。。

能看一下是OB执行的慢,还是应用比较慢吗,可以查一下OB的v$ob_sql_audit表,里面应该有执行时间的

sql.txt (3.6 KB)

这个是某一条的执行记录

这个看起来是插入一条数据
主要看下这个时间 ELAPSED_TIME,以及后面几个xxx_time的具体阶段的统计项
这一条的 ELAPSED_TIME: 922, 是922us,
可以筛选一下ELAPSED_TIME比较大的记录

老师,我这边看了下记录,并未像您的截图一样。insert value多条数据,我看都是单条执行。

sql.txt (3.7 KB)
查了下最大的那条ELAPSED_TIME

其他参数的设置呢,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也会记录到这个表里面

sql.txt (3.7 KB)
这个应该是了。看着是1519

是的,这个有1519us,1.5ms 左右,但是还得确认下为什么没有一次写入多行,spring.jpa.properties.hibernate.jdbc.batch_size 有设置吗,其他一些参数的设置是怎样的