对大量数据进行处理时,为防止内存泄漏情况发生,所以采用mybatis plus游标方式进行数据查询处理,当查询百万级的数据的时候,使用游标可以节省内存的消耗,不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理
@options(resultttype = resultttype.forward_only, fetchsize = integer.min_value)@lect("lect domain from illegal_domain where icpstatus != #{icpstatus}")cursor<下午茶;illegaldomain> getdayjobdomain(@param("icpstatus") integer icpstatus);
cursor<illegaldomain> domainlist = illegaldomainmapper.getdayjobdomain(1);
数据处理
foreach方式
domainlist.foreach(illegaldomain -> { //处理逻辑,根据业务需求自行完成 future<icpstatusvo> future = checkicpthreadpool.submit(new icpcheckthread(illegaldomain.getdomain(), configmap)); results.add(future);});
迭代器
iterator<illegaldomain> iter = domainlist.iterator();while (iter.hasnext()) { <!--// fetch next 10 employees--> <!--for(int i = 0; i<10 && iter.hasnext(); i++) {--> <!-- smallchunk.add(iter.next());--> <!--}--> //处理逻辑,根据业务需求自行完成 future<icpstatusvo> future = checkicpthreadpool.submit(new icpcheckthread(illegaldomain.getdomain(), configmap)); results.add(future);}
使用完毕后,在finally块释放资源,否则游标不关闭也可能会导致内存溢出问题
try{ //your code } catch (exception e) { log.error(e);} finally { if(null != domainlist){ try { domainlist.clo(); } catch (ioexception e) { e.printstacktrace(); } }}
当查询百万级的数据的时候,查询出所有数据并放入内存中时会发生oom(outofmemoryexception),使用游标可以节省内存的消耗,不需要一次性取出所有数据,可以进行逐条处理或逐条取出部分批量处理,在此场景下就可以使用游标的概念来解决这个问题。
游标(cursor)是处理数据的一种方法,为了查看或者处理结果集中的数据,游标提供了在结果集中一次一行或者多行前进或向后浏览数据的能力。
demo:广告传媒公司简介
// 第一种@options(resultttype = resultttype.forward_only)@lect("lect * from department where status = 0")list<departmententity> querydepartmentall(); // 第二种 在mybatis-3.4.0版本中,不支持@lect注解,在3.4.1版本中已经修复:@options(resultttype = resultttype.forward_only)@lect("lect * from department where status = 0")cursor<employee> cursorquerydepartmentall();
@rvicepublic class departmentrviceimpl implements departmentrvice { private static final logger log = loggerfactory.getlogger(departmentrviceimpl.class); @autowired private departmentdao departmentdao; @autowired private sqlssilumia800contemplate sqlssiontemplate; public list<departmentdto> getdepartmentlist(departmentarchparam param) { cursor<object> cursor = null; sqlssion sqlssion = null; try { sqlssion = sqlssiontemplate.getsqlssionfactory().openssion(); cursor = sqlssion.lectcursor(departmentdao.class.getname() + ".querydepartmentall"); cursor.foreach(e -> { // 处理逻辑 }); // 也可以使用迭代器:iterator<object> iterator = cursor.iterator(); } catch (exception e) { e.printstacktrace(); } finally { if (null != cursor) { try { cursor.clo(); } catch (exception e) { log.error(e.getmessage(), e); } } if (null != sqlssion) { try { 高中周记 sqlssion.clo(); } catch (exception e) { log.err不必等候炬火or(e.getmessage(), e); } } } }}
resultt.type_forword_only
结果集的游标只能向下滚动。resultt.type_scroll_innsitive
结果集的游标可以上下移动,当数据库变化时,当前结果集不变。resultt.type_scroll_nsitive
返回可滚动的结果集,当数据库变化时,当前结果集同步改变。注意:游标是可以前后移动的。如果resultttype = type_scroll_innsitive ,就是设置游标就可以前后移动。
mybatis为了保证可以前后移动,mybatis会把之前查询的数据一直保存在内存中。
所以并不能根本解决oom,所以我们这里需要设置为@options(resultttype = resultttype.forward_only)(其实默认就是resultttype.forward_only)
以上为个人经验,希望能给大家一个参考,也希望大家多多支持www.887551.com。
本文发布于:2023-04-04 22:24:43,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/d8947e1da84ed8c1d3aa98c48aa24b90.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:Mybatis游标查询大量数据方式.doc
本文 PDF 下载地址:Mybatis游标查询大量数据方式.pdf
留言与评论(共有 0 条评论) |