2012-09-18 5 views
0

SPARQL 쿼리를 사용하여 참깨 저장소에서 트리플을 삭제하고 삽입하고 싶습니다. 두 작업을 모두 단일 트랜잭션으로 실행하려고합니다. 예외가 트랜잭션 중에 발생하는 경우저장소 연결 - SPARQL 쿼리를 사용하여 롤백이 작동하지 않습니까?

  1. INSERT

삭제, 롤백이 실행 ... 그러나 작동하지 않을 것입니다. 삽입 쿼리 중에 예외가 발생하면 롤백이 실행되지만 이전에 삭제 된 트리플은 복구되지 않습니다 (이유는 무엇입니까?). 내가 저장소 연결을 래핑하고 SPARQL 쿼리를 만들기 위해 몇 가지 방법을 제공 OwlimConnector라는 클래스가

:

여기에 몇 가지 코드가 있습니다. 이 클래스의 생성자에서 , 나는 연결을 설정하고 나는 false로 자동 커밋 설정 :

RemoteRepositoryManager repos_manager = RemoteRepositoryManager.getInstance(SERVER_URL, USER, PASSWORD); 
repos_manager.initialize(); 
Repository ssr = repos_manager.getRepository(REPOSITORY); 
rconn = ssr.getConnection(); 
rconn.setAutoCommit(false); 

에서를 OwlimConnector executeUpdate의 호출하는 방법이있다 :

public void executeUpdate(String queryString) throws RepositoryException,    MalformedQueryException, UpdateExecutionException 
{ 
    Update up = rconn.prepareUpdate(QueryLanguage.SPARQL, queryPrefixString + queryString); 
    up.execute(); 
} 

및 다른 사람의 사이에서 이러한 방법 : 한편

public void commit(){ 
rconn.commit(); 
} 

public void rollback() {   
rconn.rollback(); 
} 

public void close(){ 
rconn.close(); 
} 

, 나는 웹 서비스 "updateUserGroup"느릅 나무 이전 OwlimConnector 및 데이터 액세스 개체라는 사용자를 사용하여이 GroupDAO :

oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }"); 
다음

트리플 더가 투입 되더라도 삭제되지 않습니다 :

@PUT 
@Consumes(MediaType.APPLICATION_XML) 
public Response updateUserGroup(UserGroup ug) { 

try { 
    oc = new OwlimConnector(); 
} catch (OwlimInstantiationException e) { 
    return ResponseFactory.getError(e.getErrorMessage()); 
} 

try { 
    UserGroupDAO ugdao = new UserGroupDAO(oc); 
    ugdao.delete(ug.getUri()); 
    ugdao.add(ug); 
    oc.commit(); 
    oc.close(); 
    return ResponseFactory.getOK(); 
} catch (MandatoryFieldException e) { 
    oc.rollback(); 
    oc.close(); 
    return ResponseFactory.getError(e.getErrorMessage()); 
} catch (NotExistingResourceException e) { 
    oc.rollback(); 
    oc.close(); 
    return ResponseFactory.getError(e.getErrorMessage()); 
} catch (Exception e) { 
    oc.rollback(); 
    oc.close(); 
    return ResponseFactory.getError(new GenericException(e).getErrorMessage()); 
} 

} 

1 무엇 ugdao.delete (ug.getUri는()) 수행하는 OwlimConnector 방법 executeUpdate의 호출하는 것입니다!

2 어떤 ugdao.add은 (UG)을 수행하는 단계이다

가 ug.getName()는 널 (NULL) 또는 공백이 아니라는 것을 확인하기 위해, 달리 MandatoryFieldException이 발생된다 : 다음

if (ug.getName() == null || ug.getName().equals("")){ 
throw new MandatoryFieldException("name"); 
} 

데이터 삽입 :

oc.executeUpdate("INSERT DATA { " + ug.getUri() + " a scmu:UserGroup ; scmu:hasName \"" + ug.getName() + "\" . }"); 

ug.getName는()는 공백

null 또는 MandatoryFieldException 예외가 발생하고 updateUserGroup에 걸려있다. 그런 다음 롤백이 실행되지만 삭제 된 트리플은 복구되지 않습니다.

왜 이렇게되는지 모르겠습니다. 어떤 아이디어?

대단히 감사합니다.

+1

이것은 매우 독특한 OWLIM 특정 문제/버그처럼 들리지만, 나는 그들의 메일 링리스트 - http : // www .ontotext.com/owlim/mailing-lists – RobV

+0

좋아, 나는 거기에서 물어볼 것이다. 내가 힌트를 얻으면 알려주지. – jegarna

답변

1

해결책은 생각보다 쉽습니다. 이것은 메일 목록의 Ontotext AD에서받은 대답입니다. 원격 업데이트를 사용하기 때문에 각 업데이트가 즉시 원격 저장소에 up.execute()로 보내지면 바로 자동 커밋됩니다.

당신이 할 수있는 일은 서비스의 각 삭제/추가 작업을 준비하고 실행하여 모든 개별 업데이트 (예 : StringBuilder) 및 oc.commit()을 수집하여 전체 목록을 준비하고 실행하는 것입니다 업데이트로 한 번에

"...

귀하의 업데이트 요청 업데이트 '데이터 삭제'를 여러 '데이터 삽입'하거나 할 수 있습니다 (다만 예외가 슬로우되는 경우에 롤백의 목록을 지우) 그리고 작동합니다! 감사합니다.

관련 문제