0

ノードを取得してドメイン オブジェクトに戻そうとすると、次の奇妙なエラーが発生します。

Exception in thread "main" java.lang.StackOverflowError
    at sun.nio.ch.NativeThreadSet.remove(NativeThreadSet.java:76)
    at sun.nio.ch.FileChannelImpl.read(FileChannelImpl.java:678)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.readFullWindow(PersistenceRow.java:158)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow$State$1.transition(PersistenceRow.java:115)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceRow.lock(PersistenceRow.java:59)
    at org.neo4j.kernel.impl.nioneo.store.PersistenceWindowPool.acquire(PersistenceWindowPool.java:193)
    at org.neo4j.kernel.impl.nioneo.store.CommonAbstractStore.acquireWindow(CommonAbstractStore.java:520)
    at org.neo4j.kernel.impl.nioneo.store.NodeStore.getRecord(NodeStore.java:76)
    at org.neo4j.kernel.impl.nioneo.xa.ReadTransaction.nodeLoadProperties(ReadTransaction.java:239)
    at org.neo4j.kernel.impl.persistence.PersistenceManager.loadNodeProperties(PersistenceManager.java:113)
    at org.neo4j.kernel.impl.core.NodeManager.loadProperties(NodeManager.java:682)
    at org.neo4j.kernel.impl.core.NodeImpl.loadProperties(NodeImpl.java:132)
    at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:584)
    at org.neo4j.kernel.impl.core.Primitive.ensureFullProperties(Primitive.java:567)
    at org.neo4j.kernel.impl.core.Primitive.getProperty(Primitive.java:153)
    at org.neo4j.kernel.impl.core.NodeImpl.getProperty(NodeImpl.java:51)
    at org.neo4j.kernel.impl.core.NodeProxy.getProperty(NodeProxy.java:155)
    at org.springframework.data.neo4j.support.typerepresentation.AbstractIndexingTypeRepresentationStrategy.readAliasFrom(AbstractIndexingTypeRepresentationStrategy.java:106)
    at org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:36)
    at org.springframework.data.neo4j.support.mapping.TRSTypeAliasAccessor.readAliasFrom(TRSTypeAliasAccessor.java:26)
    at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:96)
    at org.springframework.data.convert.DefaultTypeMapper.getDefaultedTypeToBeUsed(DefaultTypeMapper.java:144)
    at org.springframework.data.convert.DefaultTypeMapper.readType(DefaultTypeMapper.java:121)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:76)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.read(Neo4jEntityPersister.java:170)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:189)
    at org.springframework.data.neo4j.support.Neo4jTemplate.createEntityFromState(Neo4jTemplate.java:180)
    at org.springframework.data.neo4j.fieldaccess.RelationshipNodeFieldAccessorFactory$RelationshipNodeFieldAccessor.getValue(RelationshipNodeFieldAccessorFactory.java:102)
    at org.springframework.data.neo4j.fieldaccess.DefaultEntityState.getValue(DefaultEntityState.java:97)
    at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyEntityStatePropertyValue(SourceStateTransmitter.java:90)
    at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.access$000(SourceStateTransmitter.java:40)
    at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter$2.doWithAssociation(SourceStateTransmitter.java:61)
    at org.springframework.data.mapping.model.BasicPersistentEntity.doWithAssociations(BasicPersistentEntity.java:207)
    at org.springframework.data.neo4j.support.mapping.SourceStateTransmitter.copyPropertiesFrom(SourceStateTransmitter.java:57)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.loadEntity(Neo4jEntityConverterImpl.java:100)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityConverterImpl.read(Neo4jEntityConverterImpl.java:92)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister$CachedConverter.read(Neo4jEntityPersister.java:170)
    at org.springframework.data.neo4j.support.mapping.Neo4jEntityPersister.createEntityFromState(Neo4jEntityPersister.java:192)
    at org.springframework.data.neo4j.support.Neo4jTemplate.createEntityFromState(Neo4jTemplate.java:180)
    at org.springframework.data.neo4j.fieldaccess.GraphBackedEntityIterableWrapper.underlyingObjectToObject(GraphBackedEntityIterableWrapper.java:41)
    at org.springframework.data.neo4j.fieldaccess.GraphBackedEntityIterableWrapper.underlyingObjectToObject(GraphBackedEntityIterableWrapper.java:27)
    at org.neo4j.helpers.collection.IterableWrapper$MyIteratorWrapper.underlyingObjectToObject(IterableWrapper.java:57)
    at org.neo4j.helpers.collection.IteratorWrapper.next(IteratorWrapper.java:47)
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:324)
    at org.neo4j.helpers.collection.IteratorUtil.addToCollection(IteratorUtil.java:341)
    at org.springframework.data.neo4j.fieldaccess.RelatedToViaCollectionFieldAccessorFactory$RelatedToViaCollectionFieldAccessor.getValue(RelatedToViaCollectionFieldAccessorFactory.java:122)
    at org.springframework.data.neo4j.fieldaccess.DefaultEntityState.getValue(DefaultEntityState.java:97)

たとえば、これはユーザー ノード エンティティを取得しようとする私のサイファー クエリです。

public MyUser getUserByUserId(String userId){
    Long t1 = System.currentTimeMillis();
    if(existsUserByUserId(userId)){
        HashedMap params = new HashedMap();
        params.put("userId", userId);
        String query = "START x=node:searchByUserId(userId = {userId})" +
                            " RETURN x";
        Result<Map<String,Object>> result = neo4jTemplate.query(query, params);
        MyUser user = result.to(MyUser.class).single();
        Long t2 = System.currentTimeMillis();
        logger.info("get user by user id exec time: " + (t2-t1) + " ms");
        return user;
    }
    Long t2 = System.currentTimeMillis();
    logger.info("get user by id exec time: " + (t2-t1) + " ms");
    return null;    
}

wheresearchByUserIdはノード インデックスでありexistsUserByUserId、指定されたユーザーが存在するかどうかをチェックするヘルパー メソッドです。問題は、result.to() メソッドを呼び出そうとすると、このエラーがランダムに発生することです。ランダムとは、常にこのエラーが発生するわけではないことを意味します。より具体的には、ネイティブ Neo4j Java API を使用してすべてのノード/関係を挿入し、Spring Data Neo4j (リポジトリ アプローチ) でこれらのオブジェクトを取得しようとしています。これは、ノード エンティティを挿入する方法です。

public Node createAndIndexMyUserNode(MyUser user){
        Map<String,Object> properties = new HashMap<String, Object>();
        properties.put("userId", user.getUserId());
        properties.put("baseID" , user.getBaseID());
        properties.put("__type__", MyUser.class.getName());
        properties.put("canUpdate", false);
        Node node = neo4jTemplate.getOrCreateNode("searchByUserId", "userId", user.getTwitterId(), properties);
        return node;
    }

これはおそらく問題ですが、どうすれば解決できるかわかりません。データベースの不適切なシャットダウンまたは関係の作成 (その後) も 1 つの理由であると思われますが、よくわかりません。 これが、リポジトリの保存方法を使用する代わりに、すべてのノードを「手動で」挿入している理由です。提案やアイデアはありますか?

よろしくお願いします!

4

0 に答える 0