请教一个java web 方面长时间查询库的问题

江上数峰青 发布于 2015/08/20 09:49
阅读 269
收藏 0

请教个问题,web应用,有一个报表需要查询大量数据,查询耗时可能比较长,半小时左右才有结果,查询完成之后在反馈给用户,我有两个思路,求大神指点

思路一  多线程来完成这个工作,启用一个线程来进行查询计算,完成时在通知用户,但是这样有两个问题没想明白:a、一般的数据库连接是不是不支持这么长时间的连接?即线程开始查询时候到得到结果需要半小时,数据库这么长时间的连接正常吗?b、如果正在查询的时候,web服务器或者tomcat 被关闭,特别是tomcat被关闭,查询结束,这样用户就的不到结果,这种情况该怎么处理?

思路二  在数据库中建立临时表,即java将sql推给数据库后就不管,由数据库来计算并将结果存在临时表tem,完成后将临时表名存在固定的表 table 里面,同时在java里面开启调度任务,定时扫描table,如果有新的tem,则查询结果,在通知用户。数据库启用job,删除两天以前的临时表。

请问经验丰富的大神们,哪种思路是正道,如果有更好的方法,请指点。

加载中
0
猫神
猫神

半小时左右才有结果”,这个如果在线上的话,肯定是不允许的,本身就占着资源,耗数据库读写的能力,要是你查询过程中要插入数据,估计数据库会趴下;还有,谁能保证因为空闲而关闭连接

要查询大量数据,最好在夜晚定时执行:

(1)把数据导成sql脚本,可以导入到一个线上不用的数据库,再查询,有结果了再异步通知用户

(2)把数据对应格式的文件,用N台装hadoop的服务器来处理处结果,再异步通知用户,处理过程可能还设计到hive,hbase等

江上数峰青
江上数峰青
谢谢,我还没用过hadoop
0
双城记
双城记

楼上把hadoop集群搞进来真是。

报表统计这种最简单的就是开两个tomcat,一个tomcat A用作线上web服务,另外一个tomcat B做队列事件的消费者。每当用户有报表统计的请求,tomcat A就封装一个事件对象发送到队列服务器(RABBIT MQ或者activemq之类的),tomcat B收到队列事件以后就启动执行任务。

江上数峰青
江上数峰青
回复 @双城记 : 连接池是长链接吗,我再去好好研究一下
双城记
双城记
回复 @江上数峰青 : 没问题。你看那些连接池不也是一天24小时一直连着数据库的么。
江上数峰青
江上数峰青
这个思路不错,我觉得挺好,但是我还是想不明白就是我思路一里面那个问题,tomcat B长时间连着数据库,这样是不是有问题?
0
尚浩宇
尚浩宇

我倒遇到过和你一样的问题,不过我们这导出8W数据长达5个小时,中间很容易长连接报错。后来做了如下优化,希望对你有帮助:

1、数据库读写分离

2、优化导出逻辑,减少不必要的查询,使所有查询为有用查询。

3、增加异步导出机制,避免用户长时间等待页面,而页面因seesion过期导致导出失败。

4、控制每次查询记录数,我自己试了一下一次查询5000条,能稳定不报长连接错,不过我不清楚去你那的情况,需要你自己去确定一个稳定的数字,然后导出总记录数对这个数据取倍数,得出循环次数,再for循环去取数据(需要限制同时导出次数,不然很多人导出,系统和数据库依然坚持不住,除非系统是分布式的)(如果依然觉得慢,这里得出次数之后可以开次数个线程去读取数据,最后汇总,threadpoolexecutor应该知道,很容易实现这个)

提示一下:分次查询有可能存在重复数据,比如第一次查询10条,而这个时候数据库add了一条数据,恰恰就在10条之内,那么原第10条就被变成第11条。一个解决方案是分次查询完毕后对集合去重(缺点会丢失导出过程中新增数据),另一个解决方案是导出之处查询出所有数据的id集合,在截取集合根据id查询(缺点查询所有id集合之后的时间内新增的数据无法导出)。

尚浩宇
尚浩宇
回复 @江上数峰青 : 如果您的重点想在异步上,我觉得还是避免不了要分页查询,因为只要你的查询查过设定那就会报长连接错误,除非你设置了数据库的连接时长。不过一般不推荐数据库的长连接。
江上数峰青
江上数峰青
谢谢,我主要就是考虑3那个异步机制的问题。我这边需要是导出到excel,所以分页那个问题我暂时不需要考虑。您说的读写分离,这是主要从数据库性能提升这方面上来说吧,我还是想从java这个方面去捣腾
0
莫铭
莫铭

根据LZ描述,LZ的应用瓶颈主要在数据库,那么我建议优先从数据库优化着手。

(1)可以根据时间进行分区,水平切割;分区粒度可以是 年-季度(上百万)、年-月(上千万)。

(2)给检索条件字段加上相应的索引。

如果数据库已经无法再继续调优了,那么就可以考虑其他方式。

莫铭
莫铭
回复 @江上数峰青 : 你可以跟DBA提要求的呀?难道你们都是各做各的?
江上数峰青
江上数峰青
谢谢,可是我没有负责数据库,悲剧的我只能在java里面折腾
返回顶部
顶部