流式读取mysql是不是节省内存的一种方法

流式读取mysql是不是节省内存的一种方法,第1张

1 读取 *** 作开始遇到的问题是当sql查询数据量比较大时候基本读不出来。开始以为是server端处理太慢。但是在控制台是可以立即返回数据的。于是在应用

这边抓包,发现也是发送sql后立即有数据返回。但是执行ResultSet的next方法确实阻塞的。查文档翻代码原来mysql驱动默认的行为是需要把整个结果全部读取到

内存中才开始允许应用读取结果。显然与期望的行为不一致,期望的行为是流的方式读取,当结果从myql服务端返回后立即还是读取处理。这样应用就不需要大量内存

来存储这个结果集。正确的流式读取方式代码示例:

PreparedStatement ps = connection.prepareStatement("select .. from ..",

ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY)

//forward only read only也是mysql 驱动的默认值,所以不指定也是可以的 比如: PreparedStatement ps = connection.prepareStatement("select .. from ..")

ps.setFetchSize(Integer.MIN_VALUE)//也可以修改jdbc url通过defaultFetchSize参数来设置,这样默认所以的返回结果都是通过流方式读取.

ResultSet rs = ps.executeQuery()

while (rs.next()) {

System.out.println(rs.getString("fieldName"))

}

//配置数据库连接驱动

String sql = xxxxxxxx//要查询的sql

PreparedStatement ps = conn.prepareStatement(sql)

String path = xxxxxxx

ResultSet rs = ps.executeQuery()

while (rs.next()) {

InputStream is = rs.getBlob(x).getBinaryStream()//x为要取的BLOB位置

FileOutputStream os = new FileOutputStream(path + "//"

+ "存放的文件名"+“.zip”)

byte[] buff = new byte[1024]

while ((is.read(buff)) != -1) {

os.write(buff)

}

os.close()

is.close()

}

ps.close()

conn.close()


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/8678043.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-19
下一篇 2023-04-19

发表评论

登录后才能评论

评论列表(0条)

保存