论坛首页 Java企业应用论坛

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

浏览 48032 次
该帖已经被评为良好帖
作者 正文
   发表时间:2007-05-14  
如果瓶颈在xls的话,我有个比较简化的方法。比如你就用你的struts生成的html在最后输入的时候。在response里边设置一个输入参数。这样就能直接生成xls了。不要用java掉用操作xls的包
0 请登录后投票
   发表时间:2007-05-16  
换用JRockit JVM
可以改善和调整GC的性能,不妨试验一下
0 请登录后投票
   发表时间:2007-05-16  
把WAS 6.0换成轻量级容器?节省一部分内存开销?
既然不想大改代码,这些东西总可以动吧?
0 请登录后投票
   发表时间:2007-05-20  
楼主可能有点没考虑好性能瓶颈的问题,如果并发是在查询,考虑改善查询性能,可以考虑作数据库群集,如果是由于webapp不能撑住的话,可以做webapp群集,如果是打印性能瓶颈,可以考虑采用打印的单独处理,不知道是否能解决你的问题,我以前做过2000多万用户量的系统,就是采用群集的方式,最大的时候每秒钟30万访问量。我没有遇到打印的问题,但是数据库问题和你的相似,可以分多个数据库,并且采用数据库的群集。不知道这个建议是否适合你的问题。
0 请登录后投票
   发表时间:2007-05-20  
其实这个问题的关键有3

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

0 请登录后投票
   发表时间:2007-05-20  
缓存所有数据,文件可弄成字节码流,供下载!
然后,有数据更新时,在通知缓存重新load一遍数据!
其他方法,我感觉成本太昂贵了!
0 请登录后投票
   发表时间:2007-05-20  
不行的 因为查询的条件不一样,每个人权限不一样
为每一种查询对应的结果都缓存,情况太多了

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

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

谢谢楼上的回复

0 请登录后投票
   发表时间:2007-05-24  
哈,给楼主提供一套方案吧,参考自我们系统内的一个全国性的大型项目……

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

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

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

btw:java还是很有搞头的啊……
0 请登录后投票
   发表时间: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
0 请登录后投票
   发表时间:2007-07-12  
可以考虑采用流的方式,打印时不是把数据一次性全取出,而是分页取,然后不断往流里面写,类似Http Server的做法。这样内存占用较低,写个自己的BufferInputStream
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics