2013-06-19 3 views
6

Beim Versuch, neue Knoten in einer bereits vorhandenen Datenbank zu erstellen, erhalte ich die folgende Ausnahme:Fehler bei der Abfrage Sperre (org.neo4j.kernal.StoreLockException)

org.neo4j.kernal.StoreLockException.

Der Code Snippit unten ist die tatsächliche Zeile, die die Ausnahme ergibt. Darunter habe ich noch ein paar Details und die komplette Stack-Spur angehängt.

Wenn ich einen neuen Ordner erstellen und diesen als DB_PATH verwenden, funktioniert mein Code beim ersten Durchlauf einwandfrei. Beim zweiten Durchlauf wird es mit derselben Ausnahme fehlschlagen. Es sieht so aus, als verhindere etwas die Sperre.

Ich habe versucht, Berechtigungen zum Lesen/Schreiben für jede Datei in der DB_PATH zu setzen. Kein Glück. Gibt es eine Einstellung in einer der Konfigurationsdateien, die in Bezug auf Sperren deaktiviert werden muss?

-Code Werfen Exception

graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 

Mehr Detail (Linie 6)

private static GraphDatabaseService graphDB = null; 
public static final String DB_PATH = "/Users/NtroduceMe/Downloads/neo4j-community-2.0.0-M03/data/ntroduceme"; 
private static Index<Node> userNodeIndex; 
private static Index<Node> rememberMeNodeIndex; 
static { 
    graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 
    registerShutdownHook(graphDB); 
    userNodeIndex = graphDB.index().forNodes("profile_id"); 
    rememberMeNodeIndex = graphDB.index().forNodes("profile_id"); 
} 

Stack Trace

Jun 19, 2013 12:12:50 AM org.apache.catalina.core.StandardWrapperValve invoke 
SEVERE: Servlet.service() for servlet [ProfileController] in context with path [] threw exception [Servlet execution threw an exception] with root cause 
org.neo4j.kernel.StoreLockException: Could not create lock file 
    at org.neo4j.kernel.StoreLocker.checkLock(StoreLocker.java:85) 
    at org.neo4j.kernel.StoreLockerLifecycleAdapter.start(StoreLockerLifecycleAdapter.java:40) 
    at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.start(LifeSupport.java:498) 
    at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:115) 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:296) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:100) 
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:92) 
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:197) 
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:69) 
    at com.NtroduceMe.Utilities.GraphDBManager.<clinit>(GraphDBManager.java:22) 
    at com.NtroduceMe.UserProfile.Profiles.createProfile(Profiles.java:141) 
    at com.NtroduceMe.UserProfile.ProfileController.doPost(ProfileController.java:61) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:647) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004) 
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589) 
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:722) 

Helper Klasse I verwenden, um die Datenbankinstanz

public class GraphDBManager { 
    public static final String DB_PATH = "/Users/NtroduceMe/Downloads/neo4j-community-2.0.0-M03/data/ntroduceme"; 
    private static final GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);  
    private static Index<Node> userNodeIndex; 
    private static Index<Node> rememberMeNodeIndex; 
    static { 
     registerShutdownHook(graphDB); 
     userNodeIndex = graphDB.index().forNodes("profile_id"); 
     rememberMeNodeIndex = graphDB.index().forNodes("profile_id"); 
    } 

    public static GraphDatabaseService getGraphDB(){ 
     return graphDB; 
    } 

    public static Index<Node> getUserNodeIndex(){ 
     return userNodeIndex; 
    } 

    public static Index<Node> getRemberMeNodeIndex(){ 
     return rememberMeNodeIndex; 
    } 

    private static void registerShutdownHook(final GraphDatabaseService graphDb) 
    { 
     // Registers a shutdown hook for the Neo4j instance so that it 
     // shuts down nicely when the VM exits (even if you "Ctrl-C" the 
     // running application). 
     Runtime.getRuntime().addShutdownHook(new Thread() 
     { 
      @Override 
      public void run() 
      { 
       graphDb.shutdown(); 
      } 
     }); 
    } 

} 
+0

Hallo Bruder, hast du das Problem gelöst? Ich stehe jetzt vor dem gleichen Problem. – gozizibj

+0

Vor einer Weile wechselte ich zur Bolt API und hatte dieses Problem nicht. Ich glaube, ich habe neo mit sudo mit der neuesten Version installiert und nicht ein einziges Installationsproblem. –

+0

Außerdem verwende ich nicht mehr eingebettet. –

Antwort

1

Sie sind nicht ordnungsgemäß heruntergefahren Ihre Datenbank zu speichern, wenn das Programm endet, so dass er verlässt die Lock-Datei gibt.

Sie betrachten könnte einen Shutdown-Hook Einrichtung wie hier beschrieben: http://docs.neo4j.org/chunked/stable/tutorials-java-embedded-setup.html#tutorials-java-embedded-setup-startstop

+0

Ich habe dort bereits einen Shutdown-Anruf. Ich habe versucht, mit dem Shutdownhook Neustart neu gestartet und ich bekomme den gleichen Fehler. Ich glaube nicht, dass es etwas mit dem ShutdownHook zu tun hat. Das soll nicht aufgerufen werden, bis meine gesamte Bewerbung korrekt ist? Ich nehme nicht an, die Datenbank zwischen Anfragen zu starten und zu stoppen bin ich? Die Art, wie ich es eingerichtet habe, ist, dass meine Webanwendung die Datenbank einmal startet, wenn alle Klassen initialisiert sind, und dann die Shutdown-Hooks registriert, so dass sie die Datenbank schließt, wenn die VM beendet wird. Soll ich nach jeder Transaktion abschalten? –

+1

Hmm, nein - ich nehme an, das ist dann nicht das Problem. –

1

Ich frage mich nur, warum Sie Abschaltung der DB vor, die Knoten zu schaffen?

Sie können nicht schaffen Knoten eine geschlossene DB verwenden, so kann es so sein:

graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH); 
userNodeIndex = graphDB.index().forNodes("profile_id"); 
rememberMeNodeIndex = graphDB.index().forNodes("profile_id"); 
Transaction tx = graphDb.beginTx(); 
try 
    { 
    Node node = graphDb.createNode(); 
    node.setProperty(USER_ID, "userID"); 
    nodeIndex.add(node, USER_ID, "userID"); 
    } 

und nachdem Sie fininsh alle Knoten erstellen, können Sie anrufen:

registerShutdownHook(graphDB); 
+1

Ich dachte, der Zweck der registerShutdownHook-Funktion war, wie ein Rückruf zu fungieren, der nur aufgerufen wird, wenn die VM beendet wird? Wenn man es aufruft, schaltet es die db ab? –

+0

Natürlich ist es Abschaltung der DB, es ist Code wie dieser 'Private static void registerShutdownHook (final GraphDatabaseService GraphDB) { Runtime.getRuntime(). AddShutdownHook (new Thread() { @Override public void run ist () { graphDb.shutdown(); } }); } ' Wie Sie sehen, wird es einfach die laufende DB herunterfahren. –

+0

Ich sehe. Schlecht benannte Funktion. Der Begriff "registriere" durch mich aus. Ich werde es versuchen. –

1

I don Ich weiß nicht, was passiert ist, aber könntest du einfach überprüfen, ob es eine "store_lock" -Datei in deinem graphdb-Verzeichnis gibt und wenn nicht, einfach erstellen (mit "touch" -Befehl) oder so? Das sollte es lösen.

+0

Ja gibt es eine store_lock Datei –

+0

I habe etwas mehr Code hinzugefügt, aber im Grunde trage ich die db-Instanz im statischen Block einer Hilfsklasse herum. Der Fehler wird sofort beim Erstellen der Datenbank ausgelöst. Ich benutze Mac OSX Berglöwen. –

1

Ich bin mir nicht sicher, ob Sie immer noch nach einer Lösung suchen oder nicht, aber während ich an einem Projekt arbeitete, stolperte ich über das gleiche Problem. Es passiert, wenn die Datenbank nicht korrekt geschlossen wird, nachdem das Programm beendet wurde oder wenn Sie einen Shutdownhook registriert haben, geschieht dies, nachdem der Prozess zwangsweise beendet wurde (durch einige ... sehr ... rücksichtsvoll ... College zum Beispiel) also wird der Haken nie aufgerufen. Das bedeutet, dass Sie die Sperre beim nächsten Start des Programms lösen müssen. Also hier mein Code dafür, hoffe das es noch irgendwie hilft.

Natürlich sollte man das nur anrufen wenn etwas beim DB-Öffnen schief gelaufen ist! Und das sollte klar sein, aber ich werde es nur so oder so sagen, nur um sicher zu sein. Derselbe Fehler tritt auf, wenn zwei oder mehr Instanzen Ihres Programms vorhanden sind. Wenn Sie diese Methode zum Aufheben der Sperre verwenden, treten in diesem Fall weitere Probleme auf!

1

Im Neo4j Handbuch:

Die EmbeddedGraphDatabase Instanz kann unter mehreren Threads gemeinsam genutzt werden. Beachten Sie jedoch, dass Sie nicht mehrere Instanzen erstellen können, die auf dieselbe Datenbank verweisen.

Und ich hatte diesen Fehler, einfach weil ich Neo4j Server vor der Bereitstellung der Anwendung ausgeführt habe. Sobald ich den Neo4j-Server starte, wird eine leere "Lock" -Datei erstellt und im Datenbankverzeichnis abgelegt. So

Ich glaube, es liegt daran, wurde bereits eine Instanz erstellt, und ich versuchte, eine neue Instanz durch meine Java-Anwendung zu erstellen, die unmöglich ist.

Verwandte Themen