“导出excel”压力测试多并发引起的多线程冲突有关问题
“导出excel”压力测试多并发引起的多线程冲突问题
业务系统已开发完毕,正在接受客户的业务测试和性能测试。
业务测试,导出excel没有问题;但是在进行多并发压力测试时,发生了excel文件读写问题,查看代码,主要是类的属性冲突问题,大概代码如下。
写excel文件时,用了类的全局属性,写文件涉及到几行几列定位,全局属性方便,单人操作没有异常;
多并发时,大量线程并发同时调用 doExport() 方法,此时貌似全局属性就乱掉了,行列全乱掉了,甚至写excel都出现空指针。
想到过给doExport() 方法 和 loopUnitAndWriteExcel 方法 加 synchronized 或 lock,加 synchronized 可以跑成功,但是非常慢,貌似出现了线程排队,不满足要求。
加 lock 时,没有发现生效,很奇怪。
像这种多并发引起的资源共享问题,在项目中应该常见的, 请有经验的朋友谈谈。
写excel使用的jxl,貌似还有bug。
业务系统已开发完毕,正在接受客户的业务测试和性能测试。
业务测试,导出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。