2011-01-09 3 views
1

저는 EclipseLink 공급자를 사용하여 mysql 데이터베이스와 통신하고 있습니다. 내 응용 프로그램의 영역에서 라이브러리가 DB와 일치하지 않는 쿼리 데이터를 반환하고있는 것으로 나타났습니다.Java EclipseLink 지속성 라이브러리의 잘못된 데이터가 반환되었습니다.

쿼리는 다음과 같습니다

@NamedQuery(name = "EmailAddress.findAll", query = "SELECT e FROM EmailAddress e")

이 쿼리가 올바른지, 나는 그 확신합니다. 내가 그 쿼리를 실행하는 데 사용하고 코드입니다 : 나는 그것을 배열은 3 년, 약 1 시간을 EMAILADDRESS 목록의 내용을 볼 수 있도록

EntityTransaction entr = em.getTransaction(); 
    entr.begin(); 
    emailAddresses = em.createNamedQuery("EmailAddress.findAll").getResultList(); 
    em.close() 

나는 가까이에 중단 점을 넣었습니다 잘못 채워집니다. 조금 더 배경 - 이름을 나열하는 표가 있는데, 이름을 클릭하면 대화 상자가 열리고 이름을 변경할 수 있으며 대화 상자를 닫으면 테이블이 업데이트되고 (DB와 UI), 때로는 UI가 잘못 업데이트되고 편집 된 이름이 업데이트되지 않습니다. 업데이트는 위 블록을 포함한 코드를 실행합니다. 코드가 실행되기 전에 데이터베이스가 올바르게 업데이트됩니다. 배열이 올바르게 채워지지 않은 것입니다.

이 문제와 관련된 문제가 있거나 다른 아이디어가있는 사람이 있습니까?

많은 도움을 주셨습니다. 코드의 나머지 부분을 보지 않고 말을

답변

1

모든 쿼리에서 캐시가 새로 고쳐 지도록 수정되었으므로 캐시와 관련이 있습니다. 이 응용 프로그램은 단일 사용자이고 그리 크지 않은데 많은 DB 히트 곡이 없으므로이 응용 프로그램에 적합합니다.

0

어려운,하지만 당신은 확실하다 : 당신의 트랜잭션이 긴 호흡이되지 않습니다

  1. (즉, 당신이 거래를 열지 않고 기다리는 동안을 계속 열어 사용자가 무언가를하고있다). 데이터 쿼리/업데이트에 대해서만 트랜잭션을 열고 닫아야합니다.

  2. 엔티티를 만들거나 업데이트 할 때 persist(), merge() 및 refresh()를 각각 호출합니다.

+0

저는 분명히 열어서 쿼리/업데이트를 닫습니다. 그리고 나는 각각의 메소드를 올바르게 호출하고 있다고 생각합니다. 여러 시나리오에서 비슷한 일을하지만 여러 테이블에서 이런 일이 발생했습니다. 같은 이름을 계속 편집하면 값은 심지어 3 또는 4 편집 이전의 값으로 점프하는 경우가 있습니다. 이는 무언가가 지속성 라이브러리에 의해 캐시되고 있음을 암시합니다. – chvck

관련 문제