java分批同步数据oom,Mysql中使用JDBC流式查询避免数据量过大导致OOM

一、前言

java 中MySQL JDBC 封装了流式查询操作,通过设置几个参数,就可以避免一次返回数据过大导致 OOM。

二、如何使用

2.1 之前查询

public void selectData(String sqlCmd) throws SQLException {

validate(sqlCmd);

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null; try {

conn = petadataSource.getConnection();

stmt = conn.prepareStatement(sqlCmd);

rs = stmt.executeQuery(); try { while(rs.next()){ try {

System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));

} catch (SQLException e) { // TODO Auto-generated catch block

e.printStackTrace();

}

}

} catch (SQLException e) { // TODO Auto-generated catch block

e.printStackTrace();

}

} finally {

close(stmt, rs, conn);

}

}

2.2 现在流式查询

public void selectData(String sqlCmd,) throws SQLException {

validate(sqlCmd);

Connection conn = null;

PreparedStatement stmt = null;

ResultSet rs = null; try {

conn = petadataSource.getConnection();

stmt = conn.prepareStatement(sqlCmd, ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY);

stmt.setFetchSize(Integer.MIN_VALUE);

rs = stmt.executeQuery(); try { while(rs.next()){ try {

System.out.println("one:" + rs.getString(1) + "two:" + rs.getString(2) + "thrid:" + rs.getString(3));

} catch (SQLException e) { // TODO Auto-generated catch block

e.printStackTrace();

}

}

} catch (SQLException e) { // TODO Auto-generated catch block

e.printStackTrace();

}

} finally {

close(stmt, rs, conn);

}

}

可知只是prepareStatement时候改变了参数,并且设置了PreparedStatement的fetchsize为Integer.MIN_VALUE。

三、 结果对比

对于同一个sqlCmd,同一批数据,使用两种方式占用内存对比如下:

非流式编程

20170729172704_806.png

流式编程

20170729172704_417.png

另外非流式方式由于是把符合条件的数据一下子全部加在到内存,并且由于数据量比较大,mysql准备数据的时间比较长,我测试情况下需要一分钟才会返回结果到内存(数据量比较大),然后才能通过数据集访问数据。

而流式方式是每次返回一个记录到内存,所以占用内存开销比较小,并且调用后会马上可以访问数据集的数据。

20170729172705_29.jpg

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值