关于jfinal4.9.05 新增each方法的建议

https://gitee.com/jfinal/jfinal/commit/b113818b5b47f5b8f6f0f18df1ebad59ef8f845b#note_3832144 

评论区

JFinal

2020-12-14 14:15

这个功能已经有了:
int[] fetchSize = {100};
Db.each( record -> {
这里是业务代码;
return fetchSize[0]-- > 0; // fetchSize 大于 0 时返回 true,将一直循环下去
}, sql);

doubuxingle

2020-12-14 14:37

rs.setFetchSize(5000);
应该是说的这个
@JFinal

JFinal

2020-12-14 14:44

@doubuxingle 从那位同学提交的 PR 可以看出,他并没有想用 rs.setFetchSize(...):
https://gitee.com/jfinal/jfinal/pulls/60/files

steven_lhcb_9527

2020-12-14 14:47

fetchSize 起到什么作用呢?

doubuxingle

2020-12-14 14:55

@JFinal 那时我提PR还没想到这个,后来自己做的时候加上去的。。 今天看到@chcode 提及 “显著的提高性能”,瞬间回想起来了。。

doubuxingle

2020-12-14 14:56

@steven_lhcb_9527 https://www.cnblogs.com/baimingqian/p/11761942.html

JFinal

2020-12-14 15:27

@doubuxingle 你以前提交的 PR 误导了新版本添加的 each 功能:
https://gitee.com/jfinal/jfinal/pulls/60/files

我觉得 fetchSize 值 JDBC 会有一个默认值,如果数据量巨大,数据库并不会一次性将所有数据读到本地,而是会设置合适的 fetchSize,分多次读取

手动设置 fetchSize 可能的优点就是可以自己手动控制一下,但最后结果总是会读取完所有数据

doubuxingle

2020-12-14 15:35

@JFinal 是有默认值的。另外fetchSize 这个东西只能算是个辅助优化,和each功能本身的立意并不矛盾。我觉得加与不加目前来看影响并不大,一般用jdbc时也很少有人会用setFetchSize

JFinal

2020-12-14 15:48

@doubuxingle 目前来看,你可以通过继承 ModelBuilder, 然后注入 Dialect 来实现, ModelBuilder 也是可以扩展的

steven_lhcb_9527

2020-12-14 15:57

fetchSize我看了是一次JDBC查询返回fetchSize条数的记录,数量比较大时分多次查询。each方法没看懂,Function接口在这里转换为boolean有什么作用呢?如果是筛选,那么用Predict接口就行了

JFinal

2020-12-14 16:24

@steven_lhcb_9527 each 方法的 Function 参数不是为了实现筛选,而是一个针对每条记录的回调

当返回 true 的时候,继续循环后续的记录,否则终止循环

steven_lhcb_9527

2020-12-14 17:07

恩,我知道了。

chcode

2020-12-14 17:49

@JFinal @doubuxingle 对我指的是这个rs.setFetchSize()

北流家园网

2020-12-19 22:52

这个方法在什么情况下使用?之前通知的find方法怎么用上?

chcode

2022-11-21 17:04

@JFinal 最近又使用到这块的内容了,oracle大数据量查询并处理数据,由于oracle jdbc默认rs的fetchsize为10,效率较低,增大fetchsize可以减少客户端与oracle的网络往返,减少总体响应时间,如果扩展ModelBuilder则会对所有的查询生效,不利于实现对查询的精细控制

热门反馈

扫码入社