PreparedStatement 大数据查询慢解决办法

前言
项目有个需求需要查询从A库取1000w条数据搬到B库,这边需要支持不同的数据库类型,并且sql是根据客户动态配置出来的,所以就选择了PreparedStatement,后来不懈努力传输1000w条数据只需要7分钟左右。
记录一下经验

1.开始选择的方案是使用分页查询,每页查1w条,使用while循环查询,查到没有数据为止

String sql = "查询1000w条数据 limit ?,?";
PreparedStatement sourcePs = sourceConn.prepareStatement(sql);
boolean wl = Boolean.TRUE;
while (wl) {// 分页sourcePs.setInt(Constants.INT_2, pageIndex);sourcePs.setInt(Constants.INT_1, pageSize);// 每次取数加1页pageIndex += pageSize; // 获取源端数据结果集ResultSet sourceRs = sourcePs.executeQuery();if (sourceRs.next()) {// 数据处理} else {wl = Boolean.FALSE;}
}

结果:1000w数据处理完需要一个小时左右,不能满足需求规定时间。然后打印执行日志,发现前面处理1000条数据只要几百毫秒,后来到了七八秒之多,开始怀疑是不是循环查询导致数据库变慢了,然后优化sql,建索引,但效果都微乎其微

2.后来就考虑到使用多线程的方式去处理数据,由于这次修改代码没保存找不到了,就不重新写了,大概列一下思路

//============1.创建线程池
String sql = "查询1000w条数据 limit ?,?";
String countSql = "查询1000w条数据总数";
PreparedStatement sourcePs = sourceConn.prepareStatement(sql);
boolean wl = Boolean.TRUE;
int count = 总数 / 10000
for (int i = 0; i < count; i++) {// 分页sourcePs.setInt(Constants.INT_2, pageIndex);sourcePs.setInt(Constants.INT_1, pageSize);// 每次取数加1页pageIndex += pageSize; //============2.开启线程// 获取源端数据结果集ResultSet sourceRs = sourcePs.executeQuery();if (sourceRs.next()) {// 数据处理} else {wl = Boolean.FALSE;}//============3.单个子线程结束
}

结果:导致一次性创建了1000个线程,每个线程都在抢资源对数据库操作,最后执行完成花费了三个小时之多,并且某些子线程挂掉了导致数据丢失

3.最终方案后来想过多次方法之后还是没能解决问题,开始往数据库连接方面找解决方案,然后就找到了这篇文章→葵花宝典←

String sql = "查询1000w条数据";
PreparedStatement sourcePs = sourceConn.prepareStatement(sql, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
sourcePs.setFetchSize(Constants.INT_10000);
sourcePs.setFetchDirection(ResultSet.FETCH_FORWARD);

解释一下

  1. ResultSet.TYPE_SCROLL_INSENSITIVE 结果集的游标可以上下移动,当数据库变化时,当前结果集不变。
  2. ResultSet.CONCUR_READ_ONLY 不能用结果集更新数据库中的表。
  3. sourcePs.setFetchSize(Constants.INT_10000); 是使用流的方式接受数据,每次从服务器取出设置的大小的数据,
  4. sourcePs.setFetchDirection(ResultSet.FETCH_FORWARD); 是按游标从头到尾取数

这些设置在PreparedStatement源码里面注释写得很清楚了,可以自行了解下。

最终使用流这种方式1000w条数据只需要七分钟左右,完美解决!

PreparedStatement 大数据查询相关推荐

  1. 开源大数据查询分析引擎

    引言 大数据查询分析是云计算中核心问题之一,自从Google在2006年之前的几篇论文奠定云计算领域基础,尤其是GFS.Map-Reduce.Bigtable被称为云计算底层技术三大基石.GFS.Ma ...

  2. 全方位测评Hive、SparkSQL、Presto 等七个大数据查询引擎,最快的竟是……| 程序员硬核测评...

    现在大数据组件非常多,众说不一,那么每个企业在不同的使用场景里究竟应该使用哪个引擎呢?易观Spark实战营团队选取了Hive.SparkSQL.Presto.Impala.HAWQ.ClickHous ...

  3. 大数据查询分析引擎比较

    1.常见方案比较 首先,Hive/SparkSQL 在数据仓库的领域应用是比较广泛的,但是因为查询时延很难能够满足毫秒到秒级的要求,同时因为是离线计算,数据时效性也比较差. 其次,ES (Elasti ...

  4. 数据库与elasticSearch,大数据查询性能PK

    每天早上七点三十,准时推送干货 一.介绍 在这篇文章中 利用springboot+elasticSearch,实现数据高效搜索,实战开发,我们介绍了 SpringBoot 整合 ElasticSear ...

  5. 技术分享:如何用Solr搭建大数据查询平台

    技术分享:如何用Solr搭建大数据查询平台 0×00 开头照例扯淡 自从各种脱裤门事件开始层出不穷,在下就学乖了,各个地方的密码全都改成不一样的,重要帐号的密码定期更换,生怕被人社出祖宗十八代的我,甚 ...

  6. PreparedStatement实现数据查询

    PreparedStatement实现数据查询 所有数据的操作过程之中数据更新和数据的查询操作如果可以使用,那么基本上就可以直接上手开发了,如果使用PreparedStatement 接口来实现数据查 ...

  7. 大数据查询平台分享给大家!

    钱唐信领大数据查询公众号上线,内有积分系统,三级分销系统,朋友查询你得收益,提现秒到,目前刚上线,全国各地市场空白,有想法的宣传一下吧,挣钱的都是第一批人

  8. [saiku] 使用 Apache Phoenix and HBase 结合 saiku 做大数据查询分析

    saiku不仅可以对传统的RDBMS里面的数据做OLAP分析,还可以对Nosql数据库如Hbase做统计分析. 本文简单介绍下一个使用saiku去查询分析hbase数据的例子. 1.phoenix和h ...

  9. 大数据查询——HBase读写设计与实践--转

    背景介绍 本项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的不断 ...

  10. 大数据查询工具HBase读写设计与实践

    背景介绍 本项目主要解决 check 和 opinion2 张历史数据表(历史数据是指当业务发生过程中的完整中间流程和结果数据)的在线查询.原实现基于 Oracle 提供存储查询服务,随着数据量的不断 ...

最新文章

  1. SLAM小结——求解退化问题解析(F、H、E)(面试经验总结)
  2. Linux查看进程线程个数
  3. Spring scope 学习笔记
  4. boost::spirit模块演示 AST 生成的计算器示例,AST一旦创建就会被遍历
  5. MySQL之innodb与myisam:锁 事务 外键 主键 存储结构 存储大小 索引 count 注重点
  6. JavaSE之Java基础(1)
  7. 西门子array数据类型_西门子S71200之间以太网通信(图文)
  8. 绑定到异步的ObservableCollection
  9. 1661Help Jimmy
  10. 超全opencv常见图像处理操作总结及效果展示(附python代码)
  11. android平台网络命令编程,Android网络编程-Socket
  12. Altium Designer(AD)18安装
  13. android 自定义圆形进度条,Android自定义控件实现圆形进度条
  14. java pdf打印_Java 打印PDF文档的3种方法
  15. 远程桌面同步本地计算机,微软更新远程桌面应用现在终于可以在本地和远程计算机上复制文件...
  16. 【LG3244】[HNOI2015]落忆枫音
  17. iPad及BT4下的WEP破解实验与分析 | Network Security
  18. 极智资讯 | 一文看尽今年的云栖大会 有哪些好玩的
  19. Thinkpad禁用触摸板
  20. Visualizing Search Results with Solr /browse Velocity

热门文章

  1. 随机投影森林-一种近似最近邻方法(ANN)
  2. 基于Multism的高频小信号谐振放大器仿真研究
  3. 如何判断是否是webservice接口
  4. 利用selenium模拟登录webqq
  5. Java、JSP基于Web的小型购书网站
  6. 10kv变电所工程电力监控系统的设计与应用
  7. 【Java实现】南京地铁导航系统的简单实现(三)—— 图形化界面的设计
  8. vs2005项目的安装与布署
  9. VS2005制作安装包
  10. Windows Phone上的相机景深计算器