`

[求助]高并发的大数据量查询导致系统频繁宕机,咋办啊

阅读更多
我们的大数据量查询是数据库分页的,
但是导出和打印功能是基于全部数据的.

系统投入使用后,对于导出和打印功能的使用远远要高于我们的预期.

而我们的系统的硬件设备是有限的 不能再升级了.

抓取内存大对象的时候,常常发现数百个5M以上的collection大对象

我们的这个系统不大,就是一个提供一些信息管理的,页面也不多(不到1000个 其中能有6 7百的页面是查询),但是并发访问量比较大,同时在线能有5000人,而并发的查询操作至少也有500了,其中大数据量(10万以上)的太多了.这个问题怎么办啊

哪位有好的解决办法 (不生成vo 和 vo的collection也许可以,但是这样改动太大了)
而且关键是 系统已经上线了, 不太可能重新开发所有的dao层 :'(

4G内存的机器(当然java只用了2g) websphere 6.0的机器

分享到:
评论
62 楼 cydia 2011-09-01  
huoyunzsy 写道
用的mysql  单表8w条数据 count(id)就吃不消了 咋办啊

8w算什么啊 mysql绝对没问题,我这做测试都是上百万条单表
61 楼 huoyunzsy 2007-10-19  
用的mysql  单表8w条数据 count(id)就吃不消了 咋办啊
60 楼 liuwei2630 2007-07-12  
我们3000多万条数据用的是预编译表,效率稍微好点
59 楼 leadyu 2007-07-12  
可以考虑采用流的方式,打印时不是把数据一次性全取出,而是分页取,然后不断往流里面写,类似Http Server的做法。这样内存占用较低,写个自己的BufferInputStream
58 楼 lihy70 2007-05-25  
fins 写道
其实这个问题的关键有3

1 导出/打印 都是全部数据,如果不把相关方法侵入到DAO里(我们没有用spring的jdbcTemplate),那么返回一个大的collection是必然的,此时会导致OOM.
2 导出使用的组件不管是 JXL也好POI也好,都会在内存中生成XSL文件的大对象,此时亦会导致OOM
3 这些操作常常是高并发,所以OOM产生的频率更是高的离谱



fins 写道
不行的 因为查询的条件不一样,每个人权限不一样
为每一种查询对应的结果都缓存,情况太多了

其实目前对于我们这种情况,没有完美解

我发这个帖子的目的 就是想集思广益 看看 到底有哪些方案,
当别人遇到问题的时候,希望这个帖子 以及帖子里各位朋友的回复能够提供一点点帮助

谢谢楼上的回复



楼主说的没错。
以前我做过一个框架,
在这里就不再推广告叫lz去用了。
但可以谈一下我们怎么做cache,也许能(或缓解)lz的问题。
我们的cache是根据业务逻辑cache内容的。
例如,如果有个业务是list一个100万的表,
如果你cache所有的内容,机子内存肯定受不了,
如果不cache,每次到数据库去取,翻一页肯定很慢。

针对楼主的那些问题,我们一般有以下方案。
1, 如果list一个表,
可以用cache,我们的cache支持分段cache,就是说:
// 你可以写更多,这里函数用的jdk5缺省参数,它的意思是cache第一页,第二页,最后一页,假设每页显示200条数据,
 Cache.range(0, 200, 200, 400, 999800, 1000000);

导用一句话,就是“cache on need”,而不是cache所有你“可能”要用到的数据。


2,对于那些一次导出所有的数据,我们提供resultHandle,它保存一个结果集的handle,可以重复和共享使用,不占内存。

3,我们提供search操作一次可以返回所以结果,可以不组装对象,速度等同于jdbc。

你可以在下面得到我们的框架:
http://sourceforge.net/projects/dbcoat
57 楼 unifly 2007-05-24  
哈,给楼主提供一套方案吧,参考自我们系统内的一个全国性的大型项目……

主要思路是这样的:client通过Applet向server请求每页数据,然后通过Applet(利用jxl)写到Excel……
server端提供的是xml数据,这样还可以做到与后台无关……
对于较大量数据,将导出到n个Excel文件中,可以在client端指定每个Excel文件的最大记录数……

注意问题:由于受到安全沙箱的影响,需要给Applet签名,而JDK1.5以上需要创建可信任证书,JDK1.4利用自签名证书即可……

总结:优点是显而易见的,大幅减少对server的内存耗用,增加了系统的并发性……
缺点是对前台机器有较高要求,需要安装JRE……

btw:java还是很有搞头的啊……
56 楼 fins 2007-05-20  
不行的 因为查询的条件不一样,每个人权限不一样
为每一种查询对应的结果都缓存,情况太多了

其实目前对于我们这种情况,没有完美解

我发这个帖子的目的 就是想集思广益 看看 到底有哪些方案,
当别人遇到问题的时候,希望这个帖子 以及帖子里各位朋友的回复能够提供一点点帮助

谢谢楼上的回复

55 楼 galaxystar 2007-05-20  
缓存所有数据,文件可弄成字节码流,供下载!
然后,有数据更新时,在通知缓存重新load一遍数据!
其他方法,我感觉成本太昂贵了!
54 楼 fins 2007-05-20  
其实这个问题的关键有3

1 导出/打印 都是全部数据,如果不把相关方法侵入到DAO里(我们没有用spring的jdbcTemplate),那么返回一个大的collection是必然的,此时会导致OOM.
2 导出使用的组件不管是 JXL也好POI也好,都会在内存中生成XSL文件的大对象,此时亦会导致OOM
3 这些操作常常是高并发,所以OOM产生的频率更是高的离谱

53 楼 davexin 2007-05-20  
楼主可能有点没考虑好性能瓶颈的问题,如果并发是在查询,考虑改善查询性能,可以考虑作数据库群集,如果是由于webapp不能撑住的话,可以做webapp群集,如果是打印性能瓶颈,可以考虑采用打印的单独处理,不知道是否能解决你的问题,我以前做过2000多万用户量的系统,就是采用群集的方式,最大的时候每秒钟30万访问量。我没有遇到打印的问题,但是数据库问题和你的相似,可以分多个数据库,并且采用数据库的群集。不知道这个建议是否适合你的问题。
52 楼 eonhy 2007-05-16  
把WAS 6.0换成轻量级容器?节省一部分内存开销?
既然不想大改代码,这些东西总可以动吧?
51 楼 eonhy 2007-05-16  
换用JRockit JVM
可以改善和调整GC的性能,不妨试验一下
50 楼 seadog 2007-05-14  
如果瓶颈在xls的话,我有个比较简化的方法。比如你就用你的struts生成的html在最后输入的时候。在response里边设置一个输入参数。这样就能直接生成xls了。不要用java掉用操作xls的包
49 楼 tangchao 2007-05-12  
使用Cache服务器吧;将一些实时性不强的数据采取缓存策略。
比较常用的Cache服务器有负载均衡服务器F5带的RAMCache。
或者使用squid 来做缓存服务器。效果很好的。
48 楼 luogl 2007-05-11  
ahuaxuan 写道
fins 写道
打印就是用的浏览器的,但是也是打印全部(在隐藏帧里显示一个简单的表格,然后调用window.print 我也知道这方案不好,但是还有别的方法吗?)

这种打印挺好的,其他方法比如jasperreport生成pdf打印,或者applet打印,但是我觉得js打印是最好的

好象不能控制范围吧,java控制的打印方式是什么呢?
47 楼 jimmy.shine 2007-05-10  
对于打印,建议使用jasper report,在collection中放入大量数据是会让垃圾回收器回收不到。应当强制手动的进行垃圾收集。
46 楼 frankies 2007-05-10  
对于excel文件导出生成的问题,我建议不要用poi或jxl之类的工具包去生成文件,我们可以用xml+xsl->xml->把生成的xml另存为excel文件的形式。大家知道office2000之后的版本都支持xml格式.
45 楼 xly_971223 2007-05-07  
langds 写道
   嘿,本人在些论坛已潜水多年,今天也来凑个热闹.
   我个人认为,楼上的兄弟些提出了如此多的思路,虽然很开阔,但不真正实用.正如楼主所说,导致OutOfMemory的问题其实并非技术因素,而是需求和设计上的缺陷.事实上,楼上已经有一位兄弟给出了一个较实用且常用的方案:用时间换空间.
   诸如电信及银行这样的海量数据应用中,几乎没有任何一个系统是真正做到了实时下载的.且不说OutOfMemory,当下载该文件的工作就是一个大问题,每个Server上所能接受的并发线程是有限的,如果太多用户在下载资源,就必然会导致系统的吞吐率极巨下降,这导致其它用户连一个简单的请求也都做不了,甚至如果这其中出现了锁表或线程挂起的情况将会使整个系统停止服务,这是致命的.
   而事实上,或许用户并非真的就非常迫切地要求实时下载,往往一种更常见的作法就是在查询出结果后,通过将结果进行保存后,再稍后下载即可.换句话说就是用户在界面上点击"导出到文件"时,并非真正执行下载,而是将任务加入一个队列,由后台异步地并限制并发量地执行,将结果文件产生后存于文件系统,当文件生成完毕后,用户便可在界面上点击下载文件了.且该文件下载功能最好单独开启一个Server,该Server就只负责文件下载任务,这样就不会影响到系统的正常服务了.对于资源紧缺的用户来说,可以在一台机器上启动两个Server,也可以是垂直集群的方式.不用担心CPU的瓶颈,大多数的应用其实如果只跑一个Server,那么该台机器的CPU事实上是非常闲的.

单独开启一台服务器的方式 可以避免生成文件下载文件是对其他服务的影响 可以参考, 不过会增加企业的成本
ps:这种横向服务转纵向服务的方式可以解决很多webserver的问题
44 楼 langds 2007-05-05  
   嘿,本人在些论坛已潜水多年,今天也来凑个热闹.
   我个人认为,楼上的兄弟些提出了如此多的思路,虽然很开阔,但不真正实用.正如楼主所说,导致OutOfMemory的问题其实并非技术因素,而是需求和设计上的缺陷.事实上,楼上已经有一位兄弟给出了一个较实用且常用的方案:用时间换空间.
   诸如电信及银行这样的海量数据应用中,几乎没有任何一个系统是真正做到了实时下载的.且不说OutOfMemory,当下载该文件的工作就是一个大问题,每个Server上所能接受的并发线程是有限的,如果太多用户在下载资源,就必然会导致系统的吞吐率极巨下降,这导致其它用户连一个简单的请求也都做不了,甚至如果这其中出现了锁表或线程挂起的情况将会使整个系统停止服务,这是致命的.
   而事实上,或许用户并非真的就非常迫切地要求实时下载,往往一种更常见的作法就是在查询出结果后,通过将结果进行保存后,再稍后下载即可.换句话说就是用户在界面上点击"导出到文件"时,并非真正执行下载,而是将任务加入一个队列,由后台异步地并限制并发量地执行,将结果文件产生后存于文件系统,当文件生成完毕后,用户便可在界面上点击下载文件了.且该文件下载功能最好单独开启一个Server,该Server就只负责文件下载任务,这样就不会影响到系统的正常服务了.对于资源紧缺的用户来说,可以在一台机器上启动两个Server,也可以是垂直集群的方式.不用担心CPU的瓶颈,大多数的应用其实如果只跑一个Server,那么该台机器的CPU事实上是非常闲的.
43 楼 SteveGY 2007-05-01  
什么啊?这样的问题,呵呵,你们居然一定要在内存中解决所有的数据吗?无论如何,这个思路,都会遇到out of memory问题的。

1. 修改查询方式,不要生成collection,因为无论你的内存多大,随着业务的增长,数据量只会变大,内存是永远不够的。

2. 如果可以使用简单的流式文件格式生成输出,尽可能使用流式文件,什么是“流”式文件?就是不可逆向移动文件指针的字节流,这样的流可以很少使用内存,stdout, response就是典型的流式文件。对你现在的问题,csv, XLS的html格式都很合适。

3. 我曾经输出过一些大量数据行的报表,查询时,直接使用jdbc,循环fetch一行rowset,然后把数据填到格式化的htmlString中,response.write(htmlString); 再fetch下一行,这是最基本的jdbc fetch循环,好像这里每一个人都忘记了最基本的技能,这样的查询加输出根本不需要应用服务器的内存(当然还是要一点点的,基本上只有那一行rowset的内存就够了)。你甚至可以把response的buffer关掉,这样你的客户端,就可以看到类似行打印机一样的输出效果,呵呵,我的客户还比较喜欢这个效果,她说看着数据一行一行的输出比坐等5分钟白屏幕,然后瞬间看到结果更有安全感和成就感

现在,问题的关键就是,你能不能使用流式的输出字节流了,不使用字节流,这样的大量数据,逻辑上是没有一个简单的解决办法的。前面有人提了n个复杂的方法,疯掉了,还是KISS原则,仔细考虑一下。

想一下啊,你们谁见过哪一个数据库提供的查询工具,在做
select * from table_with_huge_lines;

的时候是在内存中把数据格式化好了再输出的??开玩笑

相关推荐

    WebLogic宕机大全总结

    这是因为PermGen空间主要用于存储类元数据,如果该空间设置过小,可能会导致频繁的垃圾回收甚至内存溢出。 - 更深入地分析内存使用情况,识别出内存泄漏的具体位置并进行修复。 - 使用工具如VisualVM或JConsole等...

    weblogic宕机处理文档

    这可能意味着数据读取效率低下,频繁地从磁盘加载数据,从而对系统性能造成影响。为了改善这种情况,我们调整了SGA参数以提高缓冲区的利用率,从而使系统运行更加顺畅。 然而,问题并未就此结束。在一天后,数据库...

    MySQL的一条慢SQL查询导致整个网站宕机的解决方法

    在IT行业中,数据库性能优化是至关重要的,尤其是对于高并发、大数据量的网站而言。本文主要探讨了一个由MySQL中的慢SQL查询导致整个网站宕机的问题及其解决方案。 首先,慢SQL查询通常不会直接导致网站宕机,但...

    服务器宕机怎么办?服务器故障应急预案.docx

    服务器宕机是一种常见的IT灾难,它可能会导致业务中断、数据丢失和经济损失。因此,拥有一个完善的服务器故障应急预案对于企业的正常运营至关重要。本文将讨论服务器宕机的原因、备份和冗余措施、应急预案的实施等...

    永不宕机的服务器

    在IT行业中,"永不宕机的服务器"是一个重要的概念,尤其对于那些依赖高可用性和连续服务的企业来说至关重要。"宕机"是指服务器因为各种原因停止服务,无法响应客户端请求,这对业务连续性和用户体验可能造成严重影响...

    宕机检测工具

    本文将深入探讨宕机检测工具的工作原理、功能特性以及如何运用这些工具来提升系统稳定性。 首先,宕机检测工具的核心功能是对多台服务器、多IP地址以及多个业务端口进行健康检查。这种检查通常包括以下几个方面: ...

    mysql宕机恢复经典问题解决

    如发生在 mysql 软件可承受力够但是服务器硬件,或者...宕机 又或者 MYSQL 参数配置过大或者参数配置不合理导致服务器崩溃 ,出现宕机的可能多种多样,本文档主要体现的是宕机后可能出现的问题和后遗症较大的情况是什么

    信息系统运行卡顿、宕机的原因分析与初步解决方案

    - **问题描述**:某些表数据量大且频繁进行插入、更新操作,影响系统性能。 - **解决方案**: - 对数据表进行分表设计,合理分布数据,减少单个表的数据量。 6. **TCP请求堵塞**: - **问题描述**:过多的请求...

    tomcat宕机重启脚本

    tomcat宕机重启脚本,比较简单的一种设置

    宕机没有任何好处——POWER7 能够确保宕机不影响您的业务

    ### IT知识要点:宕机对企业的影响与IBM POWER7的应对策略 #### 1. 宕机对企业的影响 - **业务中断**:宕机会导致企业工作流程的中断,直接影响业务连续性和客户服务,造成收入损失。 - **经济损失**:包括直接的...

    gitlab服务器宕机,如何恢复.doc

    然而,当GitLab服务器遭遇宕机时,可能会导致开发者无法正常进行代码的提交和下载,这对任何依赖GitLab进行日常开发工作的团队来说都是一个重大的挑战。本文将详细解释如何在GitLab服务器宕机后恢复代码仓库,确保...

    宕机是什么意思?.docx

    宕机可以是短暂的,也可以持续较长时间,严重时甚至可能导致数据丢失或服务完全不可用。 #### 二、宕机的不同称谓 在日常交流中,宕机还常被称为“当机”、“死机”,尽管这些称呼不够规范,但它们已经成为了人们...

    银行系统的高并发架构.pptx

    【银行系统的高并发架构】是针对金融机构如何处理大规模并发交易的一种设计策略,特别是在像双十一这样的高峰期,银行系统需要应对极大的交易量冲击。以下是对这部分内容的详细解释: 1. **业务情况**: - 第三方...

    mysql主备机宕机自动切换

    ### MySQL 主备机宕机自动切换详解 #### 一、MySQL主备复制机制简介 MySQL复制(Replication)是MySQL数据库系统中一个重要的特性,它允许数据从一台MySQL服务器(称为Master)复制到另一台或多台MySQL服务器...

    记录一次CentOS7因断电导致宕机的修复过程.pdf

    本文档记录了一次 CentOS 7 服务器因断电导致宕机的修复过程。该服务器的修复过程中遇到了许多问题,包括 fstab 文件的缺失、分区表的损坏、root 分区的损坏等问题。通过对这些问题的解决,最终成功地修复了服务器。...

    ORACLE数据库一次意外宕机的分析处理实记(ora-1578)[文].pdf

    该宕机事件发生在测试环境中的一台装有ORACLE数据库的AIX小机上,导致数据库宕机。我们将从故障原因分析、故障解决过程、故障后分析和故障总结四个方面对该事件进行详细的分析和讨论。 一、故障原因分析 该宕机...

    基于zookeeper集群监测服务器宕机情况,并发邮件通知

    由于项目需要,编写基于zookeeper集群监测服务器宕机情况,并发邮件通知代码;实现很简单,编写了客户端和服务端,基于maven实现,代码方面修改zookeeper ip地址,需要部署的服务器名和邮件信息即可实现。直接打包...

    nginx负载均衡配置,宕机自动切换方式

    更重要的是,nginx还提供了宕机自动切换的能力,这确保了在某后端服务器发生故障时,能够快速切换到健康节点继续提供服务,从而保障了服务的连续性和稳定性。 在nginx中进行负载均衡配置,一般会利用到默认安装的...

    主数据库服务器宕机应急预案(正式篇)

    服务器健康状态,查看服务器是否负载高,内存不够,意外断电等宕机情况。 系统状态 主从同步是否正常,数据备份是否正常。 告知协助判断人员的内容 一线工程师确认ADS服务器健康是否正常。 判断的时间要求 设备...

Global site tag (gtag.js) - Google Analytics