2012-09-18 21 views
0

我想使用SPARQL查詢刪除和插入芝麻存儲庫中的三元組,並且我希望將這兩個操作作爲單個事務執行。存儲庫連接 - 回滾無法使用SPARQL查詢工作?

  1. DELETE
  2. INSERT

如果異常交易時拋出,回滾執行......但似乎沒有工作。 問題是,如果在插入查詢期間引發異常,將執行回滾,但之前刪除的三元組不會被恢復(爲什麼?)。

在這裏,你有一些代碼:

我有一個叫OwlimConnector類封裝了存儲庫連接,並提供了一些方法,使SPARQL查詢。 在這個類的構造函數,我建立連接,我設置自動提交爲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(); 
} 

在另一方面,我有一個Web服務「updateUserGroup」至極使用以前OwlimConnector和一個稱爲數據訪問對象用戶GroupDAO:

@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方法:

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

這裏即使有沒有提交的三元組被刪除!

2什麼ugdao.add(UG)的作用是:

要檢查ug.getName()不爲空或空格,否則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()爲空或空格MandatoryFieldException拋出異常,並且通過updateUserGroup抓獲。然後執行回滾,但刪除的三元組不會被恢復。

我不知道爲什麼會發生這種情況。任何想法?

非常感謝您提前

+1

這聽起來像一個非常OWLIM特定的問題/錯誤,我會建議詢問他們的郵件列表 - http:// www .ontotext.com/owlim/mailing-lists – RobV

+0

好吧,我會在那裏問。如果我得到一些提示,我會告訴你。 – jegarna

回答

1

該解決方案比我想象的容易得多。這是我從郵件列表中的Ontotext AD收到的答案:

「您正在使用RemoteRepository,因此每次更新都會立即發送到遠程存儲庫up.execute(),並立即自動提交。

你可以做的不是準備和執行你的服務中的每個刪除/添加操作,以開始收集所有單個更新(例如在一個StringBuilder中)和在oc.commit()上準備和執行整個列表更新一次(和只清除回滾列表中,如果有異常拋出)

您的更新請求可以有多個「插入數據」或「刪除數據」更新...「

它作品!謝謝