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
本方案是游标:多次获取,一次多行。