2014-04-24 3 views
0

J'ai deux fils, le premier utilise un robot qui collecte des données et crée la base de données graphique Neo4j, le second exécute toutes les dix minutes des requêtes, comme le nombre de nœuds ajoutés jusqu'à présent afin d'analyser le graphique. Mon problème est que je ne peux pas exécuter le deuxième thread pendant que le premier est en cours d'exécution car je ne peux pas créer une nouvelle instance de la base de données. Il renvoie l'erreur suivante:Créer deux instances de la même base de données Neo4j

Exception in thread "Thread-6" java.lang.RuntimeException: org.neo4j.kernel.lifecycle.LifecycleException: Component '[email protected]' was successfully initialized, but failed to start. Please see attached cause exception. 
    at com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph.<init>(Neo4jGraph.java:165) 
    at com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph.<init>(Neo4jGraph.java:135) 
    at main.AnalyzeGraph.run(AnalyzeGraph.java:28) 
    at java.lang.Thread.run(Thread.java:745) 
Caused by: java.lang.RuntimeException: org.neo4j.kernel.lifecycle.LifecycleException: Component '[email protected]' was successfully initialized, but failed to start. Please see attached cause exception. 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:281) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:106) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:81) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:63) 
    at com.tinkerpop.blueprints.impls.neo4j.Neo4jGraph.<init>(Neo4jGraph.java:155) 
    ... 3 more 
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Component '[email protected]' was successfully initialized, but failed to start. Please see attached cause exception. 
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:497) 
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:104) 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:259) 
    ... 7 more 
Caused by: org.neo4j.kernel.StoreLockException: Unable to obtain lock on store lock file: /home/sotbeis/Desktop/neo4jDB/store_lock. Please ensure no other process is using this database, and that the directory is writable (required even for read-only access) 
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:79) 
    at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:40) 
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:491) 
    ... 9 more 
Caused by: java.nio.channels.OverlappingFileLockException 
    at sun.nio.ch.SharedFileLockTable.checkList(FileLockTable.java:255) 
    at sun.nio.ch.SharedFileLockTable.add(FileLockTable.java:152) 
    at sun.nio.ch.FileChannelImpl.tryLock(FileChannelImpl.java:1056) 
    at java.nio.channels.FileChannel.tryLock(FileChannel.java:1154) 
    at org.neo4j.kernel.impl.nioneo.store.FileLock.getOsSpecificFileLock(FileLock.java:83) 
    at org.neo4j.kernel.DefaultFileSystemAbstraction.tryLock(DefaultFileSystemAbstraction.java:83) 
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:70) 
    ... 11 more 

Y at-il un moyen de résoudre ce problème? Notez que je ne peux pas passer la première instance de la base de données graphique neo4j au second thread.

J'utilise blueprints-neo4j-graph 2.4.0.

EDIT: J'utilise la version intégrée

Répondre

0

En supposant que vous utilisez la version intégrée, je ne pense pas qu'il est possible d'avoir plusieurs instances du même graphique DB.

Vérifiez ici, même si je ne pense pas vraiment que cela vous aide si vous ne pouvez pas passer dans le graphique DB d'instance dans les fils: https://groups.google.com/forum/#!topic/nosql-databases/z9nZ80ow5QY

... Cependant, si vous le pouvez, la solution devient assez droit, par exemple singleton, etc.

également ce bit de la documentation fait allusion au fait que vous ne pouvez partager une instance entre plusieurs threads: http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-hello-world.html

Ainsi, d'après mon expérience et ce que je continue à lire, vous ne pouvez pas avoir plusieurs les instances de Neo4j s'exécutant dans votre application; ce qui est logique, de toute façon, compte tenu des préoccupations de verrouillage et quoi d'autre.

+0

Est-il possible de faire comme décrit si j'utilise la version de service? – salvador

+0

Dans ce cas, vous vous connectez via des points de terminaison REST (sauf si vous faites tout via des plugins/extensions, ce qui est peu probable), donc les mêmes problèmes ne devraient pas se produire. En d'autres termes, il est peu probable que vous utilisiez le même code pour vous connecter à l'instance du serveur (par exemple via un client Jersey ou une autre liaison telle que Neo4j JDBC, liaison REST Neo4j ou quelque chose comme Spring Data pour Neo4j. – BtySgtMajor

0

Si vous ne pouvez pas partager l'instance graphique entre vos fils, cela signifie probablement que vous avez un cas d'utilisation où un serveur Neo4j est plus adapté.

Questions connexes