2014-07-08 4 views
0

자바 기반 웹 응용 프로그램을 디버깅하고 있습니다. 이 여러 레코드가 테이블에 삽입 된 우리의 생산 환경에서보고 된 문제이지만, 다른 기록은Oracle/Java가 한 번에 여러 레코드를 생성하는 이유는 무엇입니까?

생산 문제의 결과가 유효하지 않습니다 : HDR_COL1   HDR_COL1   HDR_NO  

헤더 테이블

DOCUMENT_DATE
HDR44             2014년 6월 6일 14시 22분
HDR45     68           327         2014년 6월 6일 14 : 24 - 잘못된 데이터
    68         HDR46   6/6/2014 14:24 - 잘못된 데이터

상세 표

DTL_NO   HDR_NO   DTL_COL1   DTL_COL1
DTL76     HDR44     SR1439     4337
DTL77     HDR45     SR1439     4337 - 유효하지 않은 데이터
DTL78     HDR46   SR1439  4337 3,694,783,210 - 유효하지 않은 데이터

생산 문제 결과 :

(예상 결과 : 각 테이블에 단 하나 개의 기록).

로컬 환경에서 3 개의 연속적인 httpservletrequest를 보내이 문제를 재현하려고했습니다.
ID와 동일한 HDR_NO를 사용하는
헤더의 세 인스턴스를 삽입하려고했기 때문에 두 개의 요청이 필터링에서 필터링되었습니다.
테스트시 각 테이블에 하나의 레코드가 삽입되었습니다. 내 질문은 지금,이 버그의 원인은 무엇입니까?
내 코드는 아래 코드와 같습니다. 도와주세요. 그것은 당신이 "검증"을 어떻게하고 귀하의 질문에 명확하지 않다, 그러나 데이터베이스 중복을 수 있기 때문에이 검증은 응용 프로그램 계층에서 수행되고 있음을 시사하고

public class MyController extends SimpleFormController{ 
    public ModelAndView onSubmit(HttpServletRequest request, HttpServletResponse response,Object 
    private MyService myService 
    command, BindException errors){ 
     BeanParam bean = buildBeanParam(request); 
     myService.doTransaction(bean); 
    } 
} 
public class MyService{ 
    public void doTransaction(BeanParam bean){ 
     try{ 
      List Item items = getItems(bean);// query with one result 
      Header header = createHeader();//mysterious bug occur 
      populateDetails(header, items);//mysterious bug occur 
      } catch (GenerateIdException e) { 
      e.printStackTrace(); 
     } 
    } 
    public Header createHeader(){ 
     Header header = new Header(); 
     // generates a number with common prefix 
     header.setHeaderNo(headerNumberGenerator()); 
     header.setDocumentDate(new Date()); 
     header.setHdrcol1("String 1"); 
     header.setHdrcol2("String 2"); 
     return headerDao.save(header); 
    } 
    public void populateDetails(Header header, List;Item; items){ 
     for(Item item: items){ 
      //items.size() == 1, so one record in Detail Table is expected 
      Detail detail = new Detail(); 
      // generates a number with common prefix 
      detail.setDetailNo(detailNumberGenerator()); 
      detail.setDocumentDate(new Date()); 
      detail.setDtlcol1(item.getField1()); 
      detail.setDtlcol2(item.getField2()); 
      detail.setHeader(header); 
      detailDao.save(detail); 
     } 
    } 
} 

public class Header{ 
    @Id 
    @Column(name = "HDR_NO", length = 20) 
    private String headerNo; 

    @Temporal(TemporalType.DATE) 
    @Column(name = "DOCUMENT_DATE") 
    private Date documentDate; 

    @Column(name = "HDR_COL1") 
    private String hdrcol1; 

    @Column(name = "HDR_COL2") 
    private String hdrcol2; 

    @OneToMany(mappedBy = "header") 
    @Cascade(value = { CascadeType.PERSIST, CascadeType.MERGE }) 
    private List Details details; 
    //Getters and Setters 
} 
public class Details{ 
    @Id 
    @Column(name = "DTL_NO") 
    private String detailNo; 

    @ManyToOne 
    @JoinColumn(name = "HDR_NO", referencedColumnName = "HDR_NO") 
    private Header header; 

    @Column(name = "DTL_COL1") 
    private String dtlcol1; 

    @Column(name = "DTL_COL2") 
    private String dtlcol2; 
    //Getters and Setters 
} 
public class Item{ 
    @Column(name = "FIELD1") 
    private field1; 
    @Column(name = "FIELD2") 
    private field2; 
    //Getters and Setters 
} 
+0

예 ... 로컬 환경에서 이것을 복제 할 수 없습니다 ... – dolf

+0

원격 디버깅을 할 수 있습니까? – user75ponic

+0

사용자가 제공 한 단계를 따르면이 문제가 발생할 가능성은 거의 없습니다. 불안정한 DB 연결로 인해이 버그가 발생할 가능성이 있습니까? – dolf

답변

0

사전에
감사합니다, 기본/고유 키 제한 조건이 없습니다.

유효성 검사를하는 데 따르는 문제는 존재를 확인하기 위해 SELECT를 실행 한 시간과 삽입 할 때 다른 사람이 스누크하지 않고 삽입 한 시간 사이의 차이점입니까? 몇 밀리 초의 차이 만있을 수 있으므로 복제가 어려울 수 있습니다.

+0

에 게시하는 것입니다. 우리의 검증 도구가 세 번의 연속 요청에서 두 가지 요청을 차단하고 있다고 말하면 어쩌면 틀린 것일 수 있습니다. 내 로그를 확인하고 "HibernateOptimisticLockingFailureException"을 발견했기 때문입니다. – dolf

관련 문제