batch执行sql save

1.batch的性能优化是不是这么理解,做batch我想达到的效果是这样的

一般我们去做Model save,如果我连续做3次save会这样一个执行顺序

db open

do save1

db close

db open

do save2

db close

db open

do save3

db close

这样可以看到是db做了很多次链接关闭的操作,非常浪费性能我们其实需要的是这样

db open

do save1

do save2

do save3

do close

这样减少了2次db打开关闭的操作,batch是不是就是为了做这个优化而存在的?

2.在做batch的save的时候我传一个list<model>可以保存成功但是list的中的model不会带着自增id下来,model.save是可以带着主键id的

这样就导致了一个问题,如果我下面要继续根据这个model做log的操作,log记录依赖我model的id batch就做不到了,因为batch后我不知道插入成功的model id是多少,这个怎么办?


评论区

JFinal

2017-09-17 14:46

第一个问题:几乎不是。 因为现在数据库操作几乎都使用连接池,从连接池中获取 connection 资源在 close() 时并不是真正关闭连接,而是回收后放入池中,当然,这个回收的操作也有一定的时空消耗,但这个消耗非常小

batch 操作提升性能主要在下面几个方面,第一是客户端每次发送给数据库的数据量(sql与参数)更多,而不是以往的甚至一条一条数据发送并处理。

第二是 batch 通常是使用一条 sql 去应用于本次提交的所有数据,所以对于 sql 的解析操作只有一次,当然,这个在 prepared statment 时也会是相同 sql 共享一次解析,但总有一个 sql 解析结果的获取动作

第三是数据库内部对 batch 操作有针对性的优化,相对于单条数据操作提升处理吞吐量

第二个问题:batch 操作不支持返回 id,这个是底层 jdbc 决定的,可以尝试去 jdbc 的 api 找找是否有现成的 api 支持,记得搞定后回来分享

yjjdick1990

2017-09-17 17:21

@JFinal 我现在解决就是直接用for Model.save。
其实我比较担心的就是开关db的操作,这部分操作应该是最费性能的。
batch的话我试验过,优化肯定是有的,但是没有那么明显(可能我数据量不够),一般我也是最多20,30条一个批次提交,但是用batch感觉写的比较高大上一点。
为了解决问题,我也找不到更好的方法去做完save后记录Log取model的id最后还是用for model.save后log获取model的id做日志插入操作了

ThreeX

2017-09-18 09:58

@yjjdick1990 所以说业务标识和主键还是分开比较好,你用自增作主键,然后用个UUID之类的给业务,这样你在插入model的时候就能指定UUID,之后的业务关联也用这个UUID,岂不美哉???

yjjdick1990

2017-09-19 16:39

@ThreeX 有道理,而且用UUID做主键还利于分表