首页
App
&
Coffee
文档
项目
分享
反馈
俱乐部
登录
注册
关于jfinal4.9.05 新增each方法的建议
chcode
2020-12-14 10:35
https://gitee.com/jfinal/jfinal/commit/b113818b5b47f5b8f6f0f18df1ebad59ef8f845b#note_3832144
项目:
JFinal
评论区
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则会对所有的查询生效,不利于实现对查询的精细控制
回复
发送
我要反馈
热门反馈
扫码入社
int[] fetchSize = {100};
Db.each( record -> {
这里是业务代码;
return fetchSize[0]-- > 0; // fetchSize 大于 0 时返回 true,将一直循环下去
}, sql);