Sparksee在会议关闭时崩溃

时间:2017-04-02 20:57:07

标签: java session graph-databases 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;
}

崩溃日志:

  

关闭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)at   main.java.com.bag.server.database.SparkseeDatabaseAccess.applyCreate(SparkseeDatabaseAccess.java:595)     在   main.java.com.bag.main.DatabaseLoader.loadGraph(DatabaseLoader.java:97)     在   main.java.com.bag.main.DatabaseLoader.main(DatabaseLoader.java:191)

我无法看到我必须关闭的东西。 我关闭了所有迭代器和对象。

1 个答案:

答案 0 :(得分:0)

Google群组的原始答案: https://groups.google.com/forum/#!topic/sparksee/brcfhvFzdjg

我必须关闭临时对象&#34;对象&#34;在我给它分配新的之前。

对象tempObj = graph.select(attributeId,Condition.Equal,SparkseeUtils.getValue(entry.getValue()),objects); objects.close(); objects = tempObj;