该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-05-14
如果瓶颈在xls的话,我有个比较简化的方法。比如你就用你的struts生成的html在最后输入的时候。在response里边设置一个输入参数。这样就能直接生成xls了。不要用java掉用操作xls的包
|
|
返回顶楼 | |
发表时间:2007-05-16
换用JRockit JVM
可以改善和调整GC的性能,不妨试验一下 |
|
返回顶楼 | |
发表时间:2007-05-16
把WAS 6.0换成轻量级容器?节省一部分内存开销?
既然不想大改代码,这些东西总可以动吧? |
|
返回顶楼 | |
发表时间:2007-05-20
楼主可能有点没考虑好性能瓶颈的问题,如果并发是在查询,考虑改善查询性能,可以考虑作数据库群集,如果是由于webapp不能撑住的话,可以做webapp群集,如果是打印性能瓶颈,可以考虑采用打印的单独处理,不知道是否能解决你的问题,我以前做过2000多万用户量的系统,就是采用群集的方式,最大的时候每秒钟30万访问量。我没有遇到打印的问题,但是数据库问题和你的相似,可以分多个数据库,并且采用数据库的群集。不知道这个建议是否适合你的问题。
|
|
返回顶楼 | |
发表时间:2007-05-20
其实这个问题的关键有3
1 导出/打印 都是全部数据,如果不把相关方法侵入到DAO里(我们没有用spring的jdbcTemplate),那么返回一个大的collection是必然的,此时会导致OOM. 2 导出使用的组件不管是 JXL也好POI也好,都会在内存中生成XSL文件的大对象,此时亦会导致OOM 3 这些操作常常是高并发,所以OOM产生的频率更是高的离谱 |
|
返回顶楼 | |
发表时间:2007-05-20
缓存所有数据,文件可弄成字节码流,供下载!
然后,有数据更新时,在通知缓存重新load一遍数据! 其他方法,我感觉成本太昂贵了! |
|
返回顶楼 | |
发表时间:2007-05-20
不行的 因为查询的条件不一样,每个人权限不一样
为每一种查询对应的结果都缓存,情况太多了 其实目前对于我们这种情况,没有完美解 我发这个帖子的目的 就是想集思广益 看看 到底有哪些方案, 当别人遇到问题的时候,希望这个帖子 以及帖子里各位朋友的回复能够提供一点点帮助 谢谢楼上的回复 |
|
返回顶楼 | |
发表时间:2007-05-24
哈,给楼主提供一套方案吧,参考自我们系统内的一个全国性的大型项目……
主要思路是这样的:client通过Applet向server请求每页数据,然后通过Applet(利用jxl)写到Excel…… server端提供的是xml数据,这样还可以做到与后台无关…… 对于较大量数据,将导出到n个Excel文件中,可以在client端指定每个Excel文件的最大记录数…… 注意问题:由于受到安全沙箱的影响,需要给Applet签名,而JDK1.5以上需要创建可信任证书,JDK1.4利用自签名证书即可…… 总结:优点是显而易见的,大幅减少对server的内存耗用,增加了系统的并发性…… 缺点是对前台机器有较高要求,需要安装JRE…… btw:java还是很有搞头的啊…… |
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-07-12
可以考虑采用流的方式,打印时不是把数据一次性全取出,而是分页取,然后不断往流里面写,类似Http Server的做法。这样内存占用较低,写个自己的BufferInputStream
|
|
返回顶楼 | |