本篇文章为大家展示了怎么在MySQL中使用流式查询避免数据伯父,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
使用JDBC的<代码> PreparedStatement/声明代码>的<代码> setFetchSize 代码>方法设置为<代码> Integer.MIN_VALUE> 代码或者使用方法<代码> Statement.enableStreamingResults() 代码>可以实现流式查询,在执行<代码> ResultSet.next() 代码>方法时,会通过数据库连接一条一条的返回,这样也不会大量占用客户端的内存。
public int 执行(String , sql, boolean isStreamQuery), throws SQLException { ,Connection conn =,空; ,PreparedStatement stmt =,空; ,ResultSet rs =,空; ,int count =, 0; ,try {//才能获取数据库连接 时间=conn 才能;getConnection (); if 才能;(isStreamQuery), { ,,//设置流式查询参数 ,,stmt =, conn.prepareStatement (ResultSet.TYPE_FORWARD_ONLY, sql,还以为;ResultSet.CONCUR_READ_ONLY); ,,stmt.setFetchSize (Integer.MIN_VALUE); ,,},{else ,,//普通查询 ,,stmt =, conn.prepareStatement (sql); ,,}//才能执行查询获取结果 时间=rs 才能;stmt.executeQuery (); ,,//遍历结果 而才能(rs.next ()) { ,,System.out.println (rs.getString (1)); ,,计数+ +; ,,} ,}catch (SQLException e), { e.printStackTrace才能(); ,}finally { 关闭才能(支撑,rs,康涅狄格州); ,} ,return 计算; }
“PS”:上面的例子中通过参数<代码> isStreamQuery> 代码来切换<强>“流式查询”强>与<强>“普通查询”>强,用于下面做测试对比。
性能测试
创建了一张测试表<代码> my_test 代码>进行测试,总数据量为<代码> 27 w 代码>条,分别使用以下4个测试用例进行测试:
- <李>
大数据量普通查询(27 w条)
李> <李>大数据量流式查询(27 w条)
李> <李>小数据量普通查询(10条)
李> <李>小数据量流式查询(10条)
李>3.1。测试大数据量普通查询
@Test public void  testCommonBigData (), throws SQLException { ,String sql =,“select *,得到my_test"; ,testExecute (sql,,假); }
3.1.1。查询耗时
27 w数据量用时38秒
3.1.2。内存占用情况
使用将近1 g内存
3.2。测试大数据量流式查询
@Test public void  testStreamBigData (), throws SQLException { ,String sql =,“select *,得到my_test"; ,testExecute (sql,,真的); }
3.2.1之上。查询耗时
27 w数据量用37秒时
3.2.2。内存占用情况
由于是分批获取,所以内存在30 - 270 m波动
3.3。测试小数据量普通查询
@Test public void  testCommonSmallData (), throws SQLException { ,String sql =,“select *,得到my_test limit 100000年,10“; ,testExecute (sql,,假); }
3.3.1。查询耗时
10条数据量用时1秒
3.4。测试小数据量流式查询
@Test public void  testStreamSmallData (), throws SQLException { ,String sql =,“select *,得到my_test limit 100000年,10“; ,testExecute (sql,,真的); }
3.4.1。查询耗时
10条数据量用时1秒
上述内容就是怎么在MySQL中使用流式查询避免数据伯父,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。