这边抓包,发现也是发送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()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)