`

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

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

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

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

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

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

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

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

分享到:
评论
42 楼 zerozone 2007-05-01  
Lucas Lee 写道

1.
对于生成xls文件,我有一些经验。我用的POI。我发现,对于同样是将2万行的数据写入一个文件,放在一个sheet里和两个sheet里,内存占用能相差一倍,后者少。经过我的试验,一般一个sheet里1万行(一行有10几列)比较合适,多的就分sheet保存,可以有效的降低内存占用,约1--n倍。虽然不是终极的解决方案,也是一个可行的方案,不妨试试。


Lucas Lee说的有道理。我以前做HR产品,也有过类似经历。当从花名册导出XLS时,有时表格CELL超过100万,极易内存溢出。

改进途径:
1.修改Java Plugin 内存参数,效果不大;
2.当要导出的数据单元格超过10万时,输出不是一个而是多个XLS文件,也就是一拆多(以10万单元格为一单位),可有效避免大对象。

对极占用资源(如内存)的任务,应考虑“生产者-消费者模型+内存池”模型。数据由生产者(查询过程)从服务器端查询到内存池,消费者处理完数据从内存池移除旧数据...循环往复直到处理完毕。
41 楼 nihongye 2007-04-30  
可以算...,并发数量是500,每个大小是1m的话,那是500 * 1m  = 500m。而如果io阻塞,每个请求都得不到释放。每个请求的临时对象是5m,那就,垃圾回收又不停在浪费cpu,继续导致。。我说的好象很象真的一样。试试才知道咯...
40 楼 fins 2007-04-29  
nihongye 写道
fins 写道
programmer 写道
解决你的 excel问题,可以考虑生成csv。先在服务器生成一个临时文件来存放csv问题,然后查询数据,取数据放入stringBuffer 当此stringBuffer的数据大到一定程度时候就往文件里输出,然后清空StringBuffer 这样重复处理,直到查询出来的数据都写人文件。这样因该可以避免java的outofmemory。


类似的方法我们用过 我们是直接将 response.getOutputStream传入dao
在dao里生成  printwriter 然后直接 out.print
这个方法应该更好 避免了生成和修改文件

如果是直接使用response,这是不好的办法.可能因为io阻塞,导致对象不能及时释放。
Wrapper一个Response,写到自己实现的ByteArrayOuputStream


这样生成的ByteArrayOuputStream会不会也是大对象呢??
39 楼 umbrella 2007-04-29  
根据楼上的,是否可以这样做

每次打印都存在coolection内,重复的不加,不重复的加上,coolection对象有很多个,分组,分段,比如某个COOLECTION存第1-10000个对象,另一个存10001-20000的对象,根据打印哪些数据去从哪个COOLECTION内取数据。
38 楼 lane_cn 2007-04-28  
xly_971223 写道
lane_cn 写道
可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。

想法不错 不过每个用户所需的数据可能不同 共享有些不太实际吧


collection是不能共享的,但是collection里面的元素应该是可以共享的。
比如用户A打印的报表上有一个合同,用户B打印的报表上也有这个合同,这个合同对象就可以共享了,每个collection里面只要有这个合同的引用就行了,节约内存40%以上。
37 楼 nihongye 2007-04-28  
fins 写道
programmer 写道
解决你的 excel问题,可以考虑生成csv。先在服务器生成一个临时文件来存放csv问题,然后查询数据,取数据放入stringBuffer 当此stringBuffer的数据大到一定程度时候就往文件里输出,然后清空StringBuffer 这样重复处理,直到查询出来的数据都写人文件。这样因该可以避免java的outofmemory。


类似的方法我们用过 我们是直接将 response.getOutputStream传入dao
在dao里生成  printwriter 然后直接 out.print
这个方法应该更好 避免了生成和修改文件

如果是直接使用response,这是不好的办法.可能因为io阻塞,导致对象不能及时释放。
Wrapper一个Response,写到自己实现的ByteArrayOuputStream
36 楼 nihongye 2007-04-28  
del
35 楼 xly_971223 2007-04-27  
lane_cn 写道
可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。

想法不错 不过每个用户所需的数据可能不同 共享有些不太实际吧
34 楼 lane_cn 2007-04-27  
可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。
33 楼 抛出异常的爱 2007-04-27  
fins 写道
我们的大数据量查询是数据库分页的,
但是导出和打印功能是基于全部数据的.

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

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

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

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

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

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



用数据挖掘技术进行一定量的数据整理。
每台打印机不可能打5M左右的东西的。。。
放心吧总有能轧出来的性能的。

刚刚想点上一页
点了新手贴。。。
十二万分的抱歉。。。
权重太大了。。。
32 楼 抛出异常的爱 2007-04-27  
maoone2003 写道
如果无法提升硬件配置可以在导出或打印时控制每次打印或导出的行数,这个很容易做到的,我们以前是导出数据只要超过10W行就宕机,后来索性就只让每次导出1W行,如果客户觉得操作不便让他们内部协调提升硬件配置,要不好像没有别的解决办法啊.....


作程:定时器,延时器,多事务,哪个不能用?非要用户自己解决么?
31 楼 pufan 2007-04-27  
真是奇怪,不就是并发造成大对象过多引起out of memory error吗,最直观的方法就是控制并发数量了。
给你段代码:
final int limit=10;
final ThreadPoolExecutor threadPool = new ThreadPoolExecutor(limit, limit, 1 * 60, TimeUnit.SECONDS, new LinkedBlockingQueue());
public void outputExcel(HttpServletResponse rs,HttpServletRequest rq)
{
threadPool.execute(new Runnable() {
	public void run() {
		 读取数据库;
                   生成xsl;
                   输出到response;
			}
	});

}

你只需根据内存大小改变limit值即可。
30 楼 maoone2003 2007-04-27  
如果无法提升硬件配置可以在导出或打印时控制每次打印或导出的行数,这个很容易做到的,我们以前是导出数据只要超过10W行就宕机,后来索性就只让每次导出1W行,如果客户觉得操作不便让他们内部协调提升硬件配置,要不好像没有别的解决办法啊.....
29 楼 fins 2007-04-27  
Lucas Lee 写道
fins 写道

我说的不太准确 其实是两个瓶颈 一个是 collection对象 一个是jxl生成的xls大对象
郁闷中 我打算研究一下excel的生成原理 自己做一个合并xls文件的程序
把多个文件 合并成一个有多个sheet页的xls文件 (用jxl poi做这类操作还是会生成很大很大的对象)


1.
对于生成xls文件,我有一些经验。
我用的POI。我发现,对于同样是将2万行的数据写入一个文件,放在一个sheet里和两个sheet里,内存占用能相差一倍,后者少。经过我的试验,一般一个sheet里1万行(一行有10几列)比较合适,多的就分sheet保存,可以有效的降低内存占用,约1--n倍。
虽然不是终极的解决方案,也是一个可行的方案,不妨试试。


2.
csv是简单文本格式,内存占用量必定比xls少很多倍,但是他基本上无法表达格式。实在不行就用csv好了。


3.
还有一个曲线救国的方法,就是用html格式,技巧是,将html文件保存成xls后缀文件(假装为xls),excel是可以自动识别为html并打开,也可以保存格式。唯一的不同是,用户需要“真实”的xls格式的话,需要用Excel打开后另存为xls格式。其实用户不就是打印么,那么应该没有区别。


1 3 策略我们现在的系统都用到了
问题就是老系统 我主贴中提到的是一个老系统 郁闷啊

不过还是谢谢大家提供的方案
其实仔细看看,可以说,楼上各位的方案基本上已经涵盖了 所有的 xls的解决方法
我可以把这个帖子作为一个 方法的汇总帖了 呵呵

谢谢各位!!!
如果我们老大允许我们大刀阔斧的改造代码 一切就都OK了
现在也许问题已经不是出在方法和技巧上 而是人的问题了

以前系统设计的不够好 ,让现在的人为过去埋单,似乎也是天经地义的.毕竟我也从前辈那学到过太多的东西
呵呵

再次谢谢大家
28 楼 fins 2007-04-27  
programmer 写道
解决你的 excel问题,可以考虑生成csv。先在服务器生成一个临时文件来存放csv问题,然后查询数据,取数据放入stringBuffer 当此stringBuffer的数据大到一定程度时候就往文件里输出,然后清空StringBuffer 这样重复处理,直到查询出来的数据都写人文件。这样因该可以避免java的outofmemory。


类似的方法我们用过 我们是直接将 response.getOutputStream传入dao
在dao里生成  printwriter 然后直接 out.print
这个方法应该更好 避免了生成和修改文件
27 楼 LucasLee 2007-04-27  
fins 写道

我说的不太准确 其实是两个瓶颈 一个是 collection对象 一个是jxl生成的xls大对象
郁闷中 我打算研究一下excel的生成原理 自己做一个合并xls文件的程序
把多个文件 合并成一个有多个sheet页的xls文件 (用jxl poi做这类操作还是会生成很大很大的对象)


1.
对于生成xls文件,我有一些经验。
我用的POI。我发现,对于同样是将2万行的数据写入一个文件,放在一个sheet里和两个sheet里,内存占用能相差一倍,后者少。经过我的试验,一般一个sheet里1万行(一行有10几列)比较合适,多的就分sheet保存,可以有效的降低内存占用,约1--n倍。
虽然不是终极的解决方案,也是一个可行的方案,不妨试试。


2.
csv是简单文本格式,内存占用量必定比xls少很多倍,但是他基本上无法表达格式。实在不行就用csv好了。


3.
还有一个曲线救国的方法,就是用html格式,技巧是,将html文件保存成xls后缀文件(假装为xls),excel是可以自动识别为html并打开,也可以保存格式。唯一的不同是,用户需要“真实”的xls格式的话,需要用Excel打开后另存为xls格式。其实用户不就是打印么,那么应该没有区别。
26 楼 programmer 2007-04-27  
解决你的 excel问题,可以考虑生成csv。先在服务器生成一个临时文件来存放csv问题,然后查询数据,取数据放入stringBuffer 当此stringBuffer的数据大到一定程度时候就往文件里输出,然后清空StringBuffer 这样重复处理,直到查询出来的数据都写人文件。这样因该可以避免java的outofmemory。
25 楼 fins 2007-04-26  
sorphi 写道
fins,写完之后才发现你也提到了xls的写入才是瓶颈。

而且我刚才想了一下,我的方法中callback导致第2/3三条和第1条是冲突的。

既然方法被驳回了,那也说得过去。那就集中解决xls的生成问题吧

刚才google了一下csv -> xls的东西,虽然没找到什么有效的java代码,但是发现一个有趣的事情,有网站专门提供在线的转换。继而想到,何不单独提供一个应用来干这个事情呢?

不过用java来做这种转换,仍然摆脱不了内存占用较大的问题,看poi的API。jxl的我不清楚,照你说的,跟poi的差不多。

既然客户比较“变态”(查询这么贼多数据),那么何不让这种转换拿到client端来做呢?哈哈

继续google,activex+csv+xls

http://www.softinterface.com/Convert-Excel-ActiveX/Convert-Excel-ActiveX.htm



我说的不太准确 其实是两个瓶颈 一个是 collection对象 一个是jxl生成的xls大对象
郁闷中 我打算研究一下excel的生成原理 自己做一个合并xls文件的程序
把多个文件 合并成一个有多个sheet页的xls文件 (用jxl poi做这类操作还是会生成很大很大的对象)
24 楼 nihongye 2007-04-26  
考虑生成跟下载分成两个步骤。 另外既然内存占用那么多,jvm的内存调优也要考虑
23 楼 sorphi 2007-04-26  
fins,写完之后才发现你也提到了xls的写入才是瓶颈。

而且我刚才想了一下,我的方法中callback导致第2/3三条和第1条是冲突的。

既然方法被驳回了,那也说得过去。那就集中解决xls的生成问题吧

刚才google了一下csv -> xls的东西,虽然没找到什么有效的java代码,但是发现一个有趣的事情,有网站专门提供在线的转换。继而想到,何不单独提供一个应用来干这个事情呢?

不过用java来做这种转换,仍然摆脱不了内存占用较大的问题,看poi的API。jxl的我不清楚,照你说的,跟poi的差不多。

既然客户比较“变态”(查询这么贼多数据),那么何不让这种转换拿到client端来做呢?哈哈

继续google,activex+csv+xls

http://www.softinterface.com/Convert-Excel-ActiveX/Convert-Excel-ActiveX.htm

相关推荐

    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