我想使用SPARQL查詢刪除和插入芝麻存儲庫中的三元組,並且我希望將這兩個操作作爲單個事務執行。存儲庫連接 - 回滾無法使用SPARQL查詢工作?
- DELETE
- 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抓獲。然後執行回滾,但刪除的三元組不會被恢復。
我不知道爲什麼會發生這種情況。任何想法?
非常感謝您提前
這聽起來像一個非常OWLIM特定的問題/錯誤,我會建議詢問他們的郵件列表 - http:// www .ontotext.com/owlim/mailing-lists – RobV
好吧,我會在那裏問。如果我得到一些提示,我會告訴你。 – jegarna