论坛首页 Java企业应用论坛

“导出excel”压力测试多并发引起的多线程冲突问题

浏览 15382 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-10-28  
楼上打字累不累
0 请登录后投票
   发表时间:2011-10-28  
java_user 写道
楼上打字累不累


做出不靠谱的程序更累...
0 请登录后投票
   发表时间:2011-10-28  
linenlin01 写道
ddkk 写道
linenlin01 写道
每个Export new 一个 TestExcelExport 对象!!!如果出现OOM,你得考虑换一个写Excel的方式,拒绝POI,拒绝JXL。用文件流来写,避免创建太多对象,导致OOM。

POI,JXL这种都是每个CELL一个OBJECT,很多字节的
当初也用过以二进制流写成BIFF格式,网上有个例子,还有个BUG,改了一个 << 操作的地方才可以的
但是发现用EXCEL 2003还是2007打开后,不能修改,格式也不好控制

LZ试下BIRD-X



其实我更喜欢直接写出html文本流,然后加一个xls扩展名:)



以前2003可以这么用,现在的2007、2010打开时,总是出现非预期格式提示,UI不友好
0 请登录后投票
   发表时间:2011-10-28  
lineagezd 写道
如果对实时性要求不高的话建议可以采取异步的方式,点了之后可以某个位置生成报告稍后让客户查看。后台的话就是做了一套逻辑封装一个队列依次执行,这样肯定不会有oom的问题,如果实时性要求较高的话,可以测试下,采用对象池把这些对象先虚拟出来要用时,直接取,并发大的话,就对上限做个限制,人多个话,只能稍候再试,对象池多大这个要看内存及并发需求来看了


以前的每月统计是用这个方法的。
0 请登录后投票
   发表时间:2011-10-29  
linenlin01 写道
package test;


					writer.write("</tr>");
					
					writer.flush();
					i++;
				}
				index_start=index_start+max_record;
				
				if(index_start%record_per_page==0||index_start==Integer.parseInt(total_record)){
					
					writer.write("</table>");
					writer.write("</body>");
					writer.write("</html>");
					writer.flush();
					writer.close();
				}
			}
		
		}catch(Exception e){
			log.info("生成文件出错",e);
		}
	}
}

 

还是把代码贡献出来吧。藏着掖着,自己也是不会进步滴...原来的Excel设置的格式是提供给其他系统使用的,所以格式需要使用者自己调整。每个文件6w条记录,超过6w条将创建一个新文件。

 

 

 

此方法非常简便,就是excel文件打开时有格式提示

0 请登录后投票
   发表时间:2011-10-29  
linenlin01 写道
java_user 写道
楼上打字累不累


做出不靠谱的程序更累...


支持
0 请登录后投票
   发表时间:2011-10-29  
你的问题主要是:类的属性冲突。
解决这个问题只需要确保每个线程的类属性都有自己独立的副本,不受其他线程影响。
把类属性放到java.lang.ThreadLocal<T>中。
这是java.lang.ThreadLocal<T> api的描述:
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联
具体用法我就不写了,看一下api,相信楼主应该能解决吧。
0 请登录后投票
   发表时间:2011-10-29  
zhuhaitaode 写道
你的问题主要是:类的属性冲突。
解决这个问题只需要确保每个线程的类属性都有自己独立的副本,不受其他线程影响。
把类属性放到java.lang.ThreadLocal<T>中。
这是java.lang.ThreadLocal<T> api的描述:
该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的初始化副本。ThreadLocal 实例通常是类中的 private static 字段,它们希望将状态与某一个线程(例如,用户 ID 或事务 ID)相关联
具体用法我就不写了,看一下api,相信楼主应该能解决吧。



兄弟你说的非常正确。我之前的service类使用bean做映射的,每次用的时候getBean,并发的时候,这个getbean出来的class就有问题了。现在去掉了,每次new一个,已经解决问题。

看了下api,你说的方法应该也是可以的,集思广益啊!

3ks
0 请登录后投票
   发表时间:2011-10-29  
excel的导出如果给人看,那么直接导出数据修改拓展名会很简单,但是如果他们是要导入到其他系统呢,其他系统的接口处理的是正常的excel,这样就不行了
0 请登录后投票
   发表时间:2011-10-29  
请输入用户名 写道
excel的导出如果给人看,那么直接导出数据修改拓展名会很简单,但是如果他们是要导入到其他系统呢,其他系统的接口处理的是正常的excel,这样就不行了


的确是个痛处啊。但是可以靠 " 文件 - 另存为 - Excel 95-2003 "的手工操作来解决。不论是读取还是写入,能避开大量的Object,使用流来处理是王道。
0 请登录后投票
论坛首页 Java企业应用版

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