「excelのエクスポート」圧力テストの同時多発性によるマルチスレッド競合の問題

1894 ワード

ビジネスシステムの開発が完了し、お客様のビジネステストとパフォーマンステストを受けています.
ビジネステスト、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を追加すると成功すると考えたことがありますが、非常に遅く、スレッドが並んでいて、要求を満たしていないようです.
ロックを加えると、有効になっていないのがおかしいです.
このような同時発生の多いリソース共有の問題は、プロジェクトでよく見られるはずです.経験のある友达に話してください.
EXcelで使うjxlを書くと、バグもあるようです.