2017-04-02 9 views
1

リレーションシップの作成を実行すると、セッションが終了するとクラッシュする。セッションが終了するとSparkseeがクラッシュする

コード:

@Override 
public boolean applyCreate(final RelationshipStorage storage, final long snapshotId) 
{ 
    final Session sess = db.newSession(); 
    final Graph graph = sess.getGraph(); 
    final Objects startObjs = findNode(graph, storage.getStartNode()); 
    final Objects endObjs = findNode(graph, storage.getEndNode()); 

    if(startObjs == null || endObjs == null) 
    { 
     if(startObjs != null) 
     { 
      startObjs.close(); 
     } 
     if(endObjs != null) 
     { 
      endObjs.close(); 
     } 
     sess.close(); 
     return false; 
    } 

    final ObjectsIterator startIt = startObjs.iterator(); 
    final ObjectsIterator endIt = endObjs.iterator(); 

    while(startIt.hasNext()) 
    { 
     long startNode = startIt.next(); 
     while (endIt.hasNext()) 
     { 
      final long endNode = endIt.next(); 

      int edgeType = graph.findType(storage.getId()); 
      if (Type.InvalidType == edgeType) 
      { 
       edgeType = graph.newEdgeType(storage.getId(), true, false); 
      } 

      final long relationship = graph.findOrCreateEdge(edgeType, startNode, endNode); 
      for (final Map.Entry<String, Object> entry : storage.getProperties().entrySet()) 
      { 
       graph.setAttribute(relationship, 
         SparkseeUtils.createOrFindAttributeType(entry.getKey(), entry.getValue(), Type.GlobalType, graph), 
         SparkseeUtils.getValue(entry.getValue())); 
      } 

      int snapshotAttributeId = SparkseeUtils.createOrFindAttributeType(Constants.TAG_SNAPSHOT_ID, snapshotId, Type.GlobalType, graph); 
      graph.setAttribute(relationship, snapshotAttributeId, SparkseeUtils.getValue(snapshotId)); 

      try 
      { 
       int hashAttributeId = SparkseeUtils.createOrFindAttributeType(Constants.TAG_HASH, " ", Type.GlobalType, graph); 
       graph.setAttribute(relationship, hashAttributeId, SparkseeUtils.getValue(HashCreator.sha1FromRelationship(storage))); 
      } 
      catch (NoSuchAlgorithmException e) 
      { 
       Log.getLogger().warn("Couldn't execute create node transaction in server: " + id, e); 
       endObjs.close(); 
       startObjs.close(); 
       startIt.close(); 
       endIt.close(); 
       sess.close(); 
       return false; 
      } 
      Log.getLogger().warn("Successfully executed create relationship transaction in server: " + id); 
     } 
    } 

    startObjs.close(); 
    endObjs.close(); 
    startIt.close(); 
    endIt.close(); 
    sess.close(); 
    return true; 
} 

/** 
* Return a Objects array matching the nodeType and properties. 
* @param graph the graph. 
* @param storage the storage of the node. 
* @return Objects which match the attributes. 
*/ 
private Objects findNode(final Graph graph, final NodeStorage storage) 
{ 
    Objects objects = null; 

    if(!storage.getId().isEmpty()) 
    { 
     int nodeTypeId = SparkseeUtils.createOrFindNodeType(storage, graph); 
     objects = graph.select(nodeTypeId); 
    } 

    for (final Map.Entry<String, Object> entry : storage.getProperties().entrySet()) 
    { 
     final int attributeId = graph.findAttribute(Type.GlobalType, entry.getKey()); 

     if (objects == null || objects.isEmpty()) 
     { 
      if(objects != null) 
      { 
       objects.close(); 
      } 
      objects = graph.select(attributeId, Condition.Equal, SparkseeUtils.getValue(entry.getValue())); 
     } 
     else 
     { 
      objects = graph.select(attributeId, Condition.Equal, SparkseeUtils.getValue(entry.getValue()), objects); 
     } 
    } 
    return objects; 
} 

crashlog:

クロージングsparkseejava.lang.RuntimeException:セッションデータ com.sparsity.sparkseejavawrapJNI.delete_sparksee_gdb_Sessionに閉じるときに依然としてアクティブ(ネイティブ 方法) com.sparsity.sparksee.gdb.Session.delete(Session.java:32) com.sparsity.sparksee.gdb.Session.close(Session.java:40) main.java.com.bag.serverデータベース.SparkseeDa main.java.com.bag.main.DatabaseLoader.mainでmain.java.com.bag.main.DatabaseLoader.loadGraph(DatabaseLoader.java:97) ( でtabaseAccess.applyCreate(SparkseeDatabaseAccess.java:595) DatabaseLoader.java:191)

私はまだ閉じなければならないものは見えません。 すべてのイテレータとオブジェクトを閉じました。 Googleグループの

答えて

0

オリジナルの答え: https://groups.google.com/forum/#!topic/sparksee/brcfhvFzdjg

は、私はそれに新しいものを割り当てる前に、一時的なオブジェクト「オブジェクト」をクローズする必要があります。

オブジェクトtempObj = graph.select(attributeId、Condition.Equal、SparkseeUtils.getValue(entry.getValue())、objects); objects.close(); objects = tempObj;

関連する問題