Cusror游标
选用于要从数据库查出海量数据(如100万)逐条处理的场景。 从数据库查出海量数据(如100万),不可一次性查出来内存放不下,当使用了游标后是分成一小批一小批查出来的。
查询并返回Cusror游标
方法名 | 说明 |
---|---|
public Cursor<T> selectCursor(String sqlId ,Wrapper wrapper ) |
查询并返回Cusror游标 在mybatis 3.4.0版本中新增了一个功能,查询可以返回Cusror <T> 类型的数据, 类似于JDBC里的ResultSet类,当查询百万级的数据的时候,使用游标可以节省内存的消耗, 不需要一次性取出所有数据,可使用Cusror游标按批取出,再处理业务。 |
查询并返回Cusror游标,使用示例:
/** * 测试一 (使用了泛型) * 查询并返回Cusror游标 */ @Test public void test_select(){ String sqlId="selectByWhere"; Wrapper wrapper=new Wrapper(); wrapper.and("id >", 19019); Cursor<Log> cursor=sysLogService.selectCursor(sqlId, wrapper); Iterator<Log> iter = cursor.iterator(); while (iter.hasNext()) { Log log=iter.next(); System.out.println(log.toString()); } } /** * 测试二 (查询的非本表的数据) * 查询并返回Cusror游标 */ @Test public void test_select2(){ String sqlId="com.sicheng.admin.product.dao.ProductSpuDao.selectByWhere";//查询的非本表的数据 Wrapper wrapper=new Wrapper(); Cursor<?> cursor=sysLogService.selectCursor(sqlId, wrapper); Iterator<?> iter = cursor.iterator(); while (iter.hasNext()) { Object row=iter.next(); System.out.println(row.toString()); } }
当使用MySql数据库时的注意事项
在使用msyql的向前游标查询数据时,使用默认的jdbc参数设置,就是会内存溢出。
使用mysql游标时,保证内存不会溢出的两种方法,二选一就可。
方案一:ps.setFetchSize(Integer.MIN_VALUE),采用的是流数据接收方式,性能不差。
方案二:先在jdbc连接的url上加参数useCursorFetch=true ,再在jdbc中设置 ps.setFetchSize(500) 。
MyBatis preview:
JDBC三种读取方式:
1.一次全部:一次获取全部。 (这是默认值)
2.流式:多次获取,一次一行。 (本方案运行最稳,性能也不差)
3.游标:多次获取,一次多行。
方案一示例
找到你要使用游标的SQL,在xxx-Mapper.xml文件中,加入 fetchSize="-2147483648",如下图
本方案是
流式:多次获取,一次一行。
方案二示例
找到你要使用游标的SQL,在xxx-Mapper.xml文件中, 加入fetchSize="100" 注意同时在jdbc url上加参数useCursorFetch=true
本方案是游标:多次获取,一次多行。