Struts2기반 웹 프로그램 I/O 손실 문제


안녕하세요. 사용자 요청을 기록하는 i/o 프로그램을 만들고 있습니다. 서버가 다운 되더라도 파일로 남아 있어 언제든지 본 서버 DB와 동기화 가능하도록 하려고 합니다.

현재 테스트 중 인데, 1초에 천번의 요청을 받으면 400개 정도는 손실됩니다. java단에서 synchronized 도 걸어보고 보고 이것저것 해보아도 무슨 문제인지 모르겠습니다.

@@@@ 테스트용 클라이언트 페이지

var i=0;

function testfunction(){
    var testid = $("#Bid").val();
    if(testid==""){
        alert("아이디 입력 해주세요.");
        return;
    }
    //http://localhost:8080/api/xxxxx.do?imei=testIMEI3&phoneSerial=testSerial1&phoneModel=testModel1&phoneUptime=1:1:1&lineNumber=01000010001&pttNumber=1|123*456&networkName=lg&networkType=lte&androidVersion=1.1&swVersion=aa_f10_1212&extra=extra1
    var i=0;
    while(i!=1000){
        var myurl = "http://localhost:8080/api/trmnlInfoColctToFile.do?imei="+testid+i+"&phoneSerial=testSerial1&phoneModel=testModel1&phoneUptime=1:1:1&lineNumber=01000010001&pttNumber=1|123*456&networkName=lg&networkType=lte&androidVersion=1.1&swVersion=aa_f10_1212&extra=extra1";
        $.ajax({
               type: 'GET',
               url: myurl,
               success: function(data) {
                    console.log(data);
               }
        });
        i++;
    }
    console.log("종료");
}
</script>

ID 넣기 시작버튼

@@@@@요청을 받으면 처리하는 코드 부분 입니다.@@@@@@@@

public class TrmnlinfoColctAction extends ActionSupportEx implements Preparable {

public void prepare() throws Exception {
vo = new TrmnlinfoColctVo();
dao = new TrmnlinfoColctDao();
}

public void trmnlInfoColctToFile(){
        String Time = new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
        StringBuffer sb = new StringBuffer();

        sb.append(((TrmnlinfoColctVo)vo).getImei() == null ? "" : ((TrmnlinfoColctVo)vo).getImei());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneSerial() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneSerial());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneModel() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneModel());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPhoneUptime() == null ? "" : ((TrmnlinfoColctVo)vo).getPhoneUptime());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getLineNumber() == null ? "" : ((TrmnlinfoColctVo)vo).getLineNumber());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getPttNumber() == null ? "" : ((TrmnlinfoColctVo)vo).getPttNumber());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getNetworkName() == null ? "" : ((TrmnlinfoColctVo)vo).getNetworkName());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getNetworkType() == null ? "" : ((TrmnlinfoColctVo)vo).getNetworkType());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getAndroidVersion() == null ? "" : ((TrmnlinfoColctVo)vo).getAndroidVersion());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getSwVersion() == null ? "" : ((TrmnlinfoColctVo)vo).getSwVersion());
        sb.append(",").append(((TrmnlinfoColctVo)vo).getExtra() == null ? "" : ((TrmnlinfoColctVo)vo).getExtra());

        String fileName = Time.substring(0, 10)+".req";
        File AbsolPath = new File(fileName);
        String Mypath = AbsolPath.getAbsolutePath();
        //D:\snkorea\ktpOTA(save by file)\tools\eclipse\2016042015.req
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // 이클립스 폴더로
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // tools 폴더로
        Mypath = Mypath.substring(0,Mypath.lastIndexOf("\\")); // 프로젝트 폴더로
        Mypath = Mypath+"\\workspace\\KtpOta\\WebContent\\data\\ing";

        File myPath = new File(Mypath);
        //디렉토리 없을 경우 생성
        if(!myPath.exists()){
            myPath.mkdirs(); 
        }
        File myFilePath = new File(Mypath+"\\"+fileName);
        FileWriter fw = null;
        //파일 유무 확인
        try{

            if(myFilePath.isFile()){
                //System.out.println("파일존재");
                fw = new FileWriter(myFilePath, true);
                fw.write(sb.toString()+"\n");
                fw.flush();
            }else{
                //System.out.println("파일존재하지 않음");
                fw = new FileWriter(myFilePath, false);
                fw.write(sb.toString()+"\n");
                fw.flush();
            }

            fw.close();
        }catch(Exception e){
            e.printStackTrace();
        }
        System.out.println("요청처리");
}
}
  • 2016년 04월 21일에 작성됨

  • 테스트 코드에 문제가 있는 것 같네요. jmeter 같은 툴을 써서 해보세요.    허대영(Daeyoung Heo)   2016.4.21 22:02     
조회수 167


로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close