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

本方案是游标:多次获取,一次多行。