jap +达梦数据库
插入1300多条数据,耗时70s,实在是太慢了;
看saveAllAndFlush方法,发现执行批量添加时,采用for循环,实则为一条一条添加,
而且插入时还判断版本号和数据在数据库中是否有重复,
有没有什么好的方法?
#根据网上的教程搞了一下午,都不行,重写方法那个我也研究了一下,不过是跳过检查的逻辑,直接执行插入;而我这里是插入前判断有没有,有则更新无则插入;
#昨天晚上回去想了一下,既然他本身方法是循环调用save()的,那么就可以使用多线程,在for循环中调用多线程执行saveFlush方法,早上上服务器跑了一遍,原本1300多条数据需要70秒左右,现在只需要20多秒左右,(看来还是可行的),但是问题来了,客户数据会分包发送数据,大概7万多数据,算下来需要20分钟多,这实在是有些拉胯,考虑换框架了,有没有推荐的框架或者方法(批量更新插入的方法)
#经过多次尝试,最终还是没有找到解决办法,不过想到了另外一招,数据请求过来,先返回数据,再执行数据库操作,用for循环遍历list,用@Async异步调用saveAndFlush方法,即在循环中依次调用单条数据的更新插入,用demo测试100条数据的更新插入,,原来批量方法耗时16秒,改造后耗时0.05秒左右,结果还可以;有个·前提,数据库插入更新操作确保不会出错,不然报错没有返回消息(个人理解)。
#此贴暂时中止,如有更好方法,欢迎留言
如果没有现成的实现,实在不行,自己实现一个批量插入
1300条70秒确实太慢了,首先需要确认耗时是花费在校验版本号还是插入。查询慢可以通过添加索引提高性能,如果是插入慢的话,可以改下逻辑
能不能考虑加个中间件,异步响应。进来的数据先去缓存,存完以后清掉缓存呢。
没存完之前去缓存拿。
可以代码先进行一遍初筛,校验是否启用单例模式,如果可以优化的话建议自己进行优化
而我这里是插入前判断有没有,有则更新无则插入;这个逻辑可以用mysql 的 on duplicate update
批量插入配置加了么?可以尝试一下,应该会有明显改善
spring:
jpa:
properties:
hibernate:
# 开启批量插入
jdbc:
batch_size: 500
batch_versioned_data: true