Java 存储库连接-使用SPARQL查询回滚不起作用?

Java 存储库连接-使用SPARQL查询回滚不起作用?,java,sparql,sesame,Java,Sparql,Sesame,我希望使用SPARQL查询从sesame存储库中删除和插入三元组,并希望将这两个操作作为单个事务执行 删除 插入 如果在事务期间引发异常,则执行回滚。。。但它似乎不起作用。 问题是,如果在insert查询期间引发异常,则执行回滚,但不会恢复以前删除的三元组(为什么?) 这里有一些代码: 我有一个名为OwlimConnector的类,它包装了存储库连接,并提供了一些进行SPARQL查询的方法。 在该类的构造函数中,我设置了连接,并将自动提交设置为false: RemoteRepositoryMan

我希望使用SPARQL查询从sesame存储库中删除和插入三元组,并希望将这两个操作作为单个事务执行

  • 删除
  • 插入
  • 如果在事务期间引发异常,则执行回滚。。。但它似乎不起作用。 问题是,如果在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();
    }
    
    oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }");
    
    这些方法包括:

    public void commit(){
    rconn.commit();
    }
    
    public void rollback() {        
    rconn.rollback();
    }
    
    public void close(){
    rconn.close();
    }
    
    另一方面,我有一个web服务“updateUserGroup”,它使用以前的OwlimConnector和一个名为UserGroupDAO的数据访问对象:

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

    public void executeUpdate(String queryString) throws RepositoryException,                MalformedQueryException, UpdateExecutionException
    {
      Update up = rconn.prepareUpdate(QueryLanguage.SPARQL, queryPrefixString + queryString);
      up.execute();
    }
    
    oc.executeUpdate("DELETE { " + usergroup + " ?p ?v . } WHERE { " + usergroup + " ?p ?v . }");
    
    在这里,即使没有提交,也会删除三元组

    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或空格时,updateUserGroup将引发并捕获MandatoryFieldException异常。然后执行回滚,但不会恢复已删除的三元组

    我不知道为什么会这样。有什么想法吗


    事先非常感谢

    解决方案比我想象的要简单得多。这是我从邮件列表中的Ontotext广告中得到的答案:

    “您正在使用RemoteRepository,因此每次更新都会立即发送到up.execute()上的远程存储库,并在那里立即自动提交

    您可以做的不是准备并执行服务中的每个删除/添加操作,以开始收集所有单个更新(例如到StringBuilder中),而是在oc.commit()上立即准备并执行整个更新列表(如果引发异常,只需在回滚时清除列表)

    您的更新请求可以有多个“插入数据”或“删除数据”更新


    而且它有效!谢谢。

    这听起来像是一个非常针对OWLIM的问题/错误,我建议在他们的邮件列表上询问-好的,我将在那里询问。如果我得到一些提示,我会让你知道的。