精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-10-26
业务测试,导出excel没有问题;但是在进行多并发压力测试时,发生了excel文件读写问题,查看代码,主要是类的属性冲突问题,大概代码如下。 package test; public class TestExcelExport { private int rowLine = 0;//全局变量,行号 private Object workbookObj = null;//全局变量 private Object sheetObj = null;//全局变量 //synchronized ?? lock ?? public void doExport(String unitid) { initVar(); writeExcelTableHeader(); loopUnitAndWriteExcel(unitid); sheetObj = "sheetObj.close()"; workbookObj = "workbookObj.close()"; } public void initVar() { rowLine = 0; workbookObj = "createWorkbook()"; sheetObj = "workbookObj.createSheet(0)"; } public void writeExcelTableHeader() { System.out.println("sheetObj.addCell(xxx,yyy)"); } //synchronized ?? lock ?? //获取机构,并递归下级机构 public void loopUnitAndWriteExcel(String unitid) { this.rowLine++; System.out.println("sheetObj.addCell("+unitid+","+rowLine+")"); if (this.rowLine > 65536) { sheetObj = "workbookObj.createSheet(1)"; } unitid = "new-value"; loopUnitAndWriteExcel(unitid); //获取机构人员 System.out.println("sheetObj.addCell(unit_member)"); } } 写excel文件时,用了类的全局属性,写文件涉及到几行几列定位,全局属性方便,单人操作没有异常; 多并发时,大量线程并发同时调用 doExport() 方法,此时貌似全局属性就乱掉了,行列全乱掉了,甚至写excel都出现空指针。 想到过给doExport() 方法 和 loopUnitAndWriteExcel 方法 加 synchronized 或 lock,加 synchronized 可以跑成功,但是非常慢,貌似出现了线程排队,不满足要求。 加 lock 时,没有发现生效,很奇怪。 像这种多并发引起的资源共享问题,在项目中应该常见的, 请有经验的朋友谈谈。 写excel使用的jxl,貌似还有bug。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2011-10-26
怎么调用的?先找到多线程操作的共享资源,是文件还是你的系统中只有一个TestExcelExport实例供多线程调用,找到共享资源,缩小锁的范围。基本思路
|
|
返回顶楼 | |
发表时间:2011-10-27
只有一个TestExcelExport实例供多线程调用
action里直接调用 doExport(String unitid) 方法 比如,第一次request请求是,正在执行 doExport(12345),还没结束 第二次request又发来了,也在执行 doExport(23456) 方法, 这样,第一次执行里的行号rowLine是30,第二次执行时可能变成25,这样递归方法loopUnitAndWriteExcel()里获取的rowLine可能就不是真实的rowLine 另外,并发时,workbookObj 和sheetObj 也貌似存在冲突,在eclipse里几乎没法手动观察并发的资源 我尝试将workbookObj 、sheetObj 、rowLine作为方法的参数传递,貌似没有成功 |
|
返回顶楼 | |
发表时间:2011-10-27
难道大家都没经历过多并发的压力测试????
|
|
返回顶楼 | |
发表时间:2011-10-27
每回new一个
|
|
返回顶楼 | |
发表时间:2011-10-27
gtssgtss 写道 每回new一个
也有一定道理,new多了可能会出现OOM,我的数据库连接,使用spring的bean映射的,不是是否方法作为参数传递 明天试试看。 |
|
返回顶楼 | |
发表时间:2011-10-27
使用poi包试试看
|
|
返回顶楼 | |
发表时间:2011-10-27
longware 写道 难道大家都没经历过多并发的压力测试????
我想我是不会设计出这样的程序的 |
|
返回顶楼 | |
发表时间:2011-10-27
还是synchronized吧,导出excel的并发量应该不会很大,慢点无妨
|
|
返回顶楼 | |
发表时间:2011-10-28
longware 写道 gtssgtss 写道 每回new一个
也有一定道理,new多了可能会出现OOM,我的数据库连接,使用spring的bean映射的,不是是否方法作为参数传递 明天试试看。 复议,每次写入单独new一个 |
|
返回顶楼 | |