该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2007-04-27
如果无法提升硬件配置可以在导出或打印时控制每次打印或导出的行数,这个很容易做到的,我们以前是导出数据只要超过10W行就宕机,后来索性就只让每次导出1W行,如果客户觉得操作不便让他们内部协调提升硬件配置,要不好像没有别的解决办法啊.....
|
|
返回顶楼 | |
发表时间: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值即可。 |
|
返回顶楼 | |
发表时间:2007-04-27
maoone2003 写道 如果无法提升硬件配置可以在导出或打印时控制每次打印或导出的行数,这个很容易做到的,我们以前是导出数据只要超过10W行就宕机,后来索性就只让每次导出1W行,如果客户觉得操作不便让他们内部协调提升硬件配置,要不好像没有别的解决办法啊.....
作程:定时器,延时器,多事务,哪个不能用?非要用户自己解决么? |
|
返回顶楼 | |
发表时间:2007-04-27
fins 写道 我们的大数据量查询是数据库分页的,
但是导出和打印功能是基于全部数据的. 系统投入使用后,对于导出和打印功能的使用远远要高于我们的预期. 而我们的系统的硬件设备是有限的 不能再升级了. 抓取内存大对象的时候,常常发现数百个5M以上的collection大对象 我们的这个系统不大,就是一个提供一些信息管理的,页面也不多(不到1000个 其中能有6 7百的页面是查询),但是并发访问量比较大,同时在线能有5000人,而并发的查询操作至少也有500了,其中大数据量(10万以上)的太多了.这个问题怎么办啊 哪位有好的解决办法 (不生成vo 和 vo的collection也许可以,但是这样改动太大了) 而且关键是 系统已经上线了, 不太可能重新开发所有的dao层 :'( 4G内存的机器(当然java只用了2g) websphere 6.0的机器 用数据挖掘技术进行一定量的数据整理。 每台打印机不可能打5M左右的东西的。。。 放心吧总有能轧出来的性能的。 刚刚想点上一页 点了新手贴。。。 十二万分的抱歉。。。 权重太大了。。。 |
|
返回顶楼 | |
发表时间:2007-04-27
可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。
|
|
返回顶楼 | |
发表时间:2007-04-27
lane_cn 写道 可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。
想法不错 不过每个用户所需的数据可能不同 共享有些不太实际吧 |
|
返回顶楼 | |
发表时间:2007-04-28
del
|
|
返回顶楼 | |
发表时间: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 |
|
返回顶楼 | |
发表时间:2007-04-28
xly_971223 写道 lane_cn 写道 可以分析一下能不能在多个会话中共享一些对象,也许一个collection里面的元素和另一个collection的元素都是同一个,没必要建立一个新的,既浪费内存,又降低了效率。
想法不错 不过每个用户所需的数据可能不同 共享有些不太实际吧 collection是不能共享的,但是collection里面的元素应该是可以共享的。 比如用户A打印的报表上有一个合同,用户B打印的报表上也有这个合同,这个合同对象就可以共享了,每个collection里面只要有这个合同的引用就行了,节约内存40%以上。 |
|
返回顶楼 | |
发表时间:2007-04-29
根据楼上的,是否可以这样做
每次打印都存在coolection内,重复的不加,不重复的加上,coolection对象有很多个,分组,分段,比如某个COOLECTION存第1-10000个对象,另一个存10001-20000的对象,根据打印哪些数据去从哪个COOLECTION内取数据。 |
|
返回顶楼 | |