Я использую neo4j на сервере Glassfish через модифицированную версию JCA-коннектора neo4j Alex Smirnov. Моя версия доступна здесь: https://github.com/Riduidel/neo4j-connector. м с помощью этого разъема с neo4j 1.8. Как следствие, когда я хочу его использовать, я сначала устанавливаю коннектор на моем сервере приложений Glassfish, а затем использую этот коннектор в приложениях, к которым нужно подключиться.
Он работает нормально при использовании его со свежими магазинами. Но при использовании его с магазинами, созданными в предыдущей версии, я сталкиваюсь со странными ошибками.
Как правило, я получил сегодня следующий стек
javax.resource.spi.ResourceAllocationException: Error in allocating a connection. Cause: Failed to transition org.neo4j.kernel.InternalAbstractGraphDatabase$DefaultKernelExtensionLoader@3bbd53b1 from NONE to STOPPED
...
...
.../* JCA internal exception stack */
...
...
Caused by: com.sun.appserv.connectors.internal.api.PoolingException: Failed to transition org.neo4j.kernel.InternalAbstractGraphDatabase$DefaultKernelExtensionLoader@494b584c from NONE to STOPPED
at com.sun.enterprise.resource.pool.ConnectionPool.createSingleResource(ConnectionPool.java:924)
at com.sun.enterprise.resource.pool.ConnectionPool.createResource(ConnectionPool.java:1185)
at com.sun.enterprise.resource.pool.datastructure.RWLockDataStructure.addResource(RWLockDataStructure.java:98)
... 66 more
Caused by: org.neo4j.kernel.lifecycle.LifecycleException: Failed to transition org.neo4j.kernel.InternalAbstractGraphDatabase$DefaultKernelExtensionLoader@494b584c from NONE to STOPPED
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:388)
at org.neo4j.kernel.lifecycle.LifeSupport.init(LifeSupport.java:82)
at org.neo4j.kernel.lifecycle.LifeSupport.start(LifeSupport.java:116)
at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:227)
at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:79)
at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:70)
at com.netoprise.neo4j.AbstractNeo4jManagedConnectionFactory.createDatabase(AbstractNeo4jManagedConnectionFactory.java:165)
at com.netoprise.neo4j.AbstractNeo4jManagedConnectionFactory.createDatabase(AbstractNeo4jManagedConnectionFactory.java:127)
at com.netoprise.neo4j.Neo4jManagedConnectionFactory.createManagedConnection(Neo4jManagedConnectionFactory.java:163)
at com.sun.enterprise.resource.allocator.ConnectorAllocator.createResource(ConnectorAllocator.java:160)
at com.sun.enterprise.resource.pool.ConnectionPool.createSingleResource(ConnectionPool.java:907)
... 68 more
Caused by: java.lang.AssertionError
at org.neo4j.index.impl.lucene.LuceneDataSource.cleanWriteLocks(LuceneDataSource.java:265)
at org.neo4j.index.impl.lucene.LuceneDataSource.cleanWriteLocks(LuceneDataSource.java:260)
at org.neo4j.index.impl.lucene.LuceneDataSource.cleanWriteLocks(LuceneDataSource.java:260)
at org.neo4j.index.impl.lucene.LuceneDataSource.cleanWriteLocks(LuceneDataSource.java:260)
at org.neo4j.index.impl.lucene.LuceneDataSource.<init>(LuceneDataSource.java:185)
at org.neo4j.index.lucene.LuceneIndexProvider.load(LuceneIndexProvider.java:72)
at org.neo4j.kernel.InternalAbstractGraphDatabase$DefaultKernelExtensionLoader.loadIndexImplementations(InternalAbstractGraphDatabase.java:1171)
at org.neo4j.kernel.InternalAbstractGraphDatabase$DefaultKernelExtensionLoader.init(InternalAbstractGraphDatabase.java:1143)
at org.neo4j.kernel.lifecycle.LifeSupport$LifecycleInstance.init(LifeSupport.java:382)
... 78 more
Быстрая проверка показывает, что это исключение связано с неудаляемым файлом «write.lock». Мой файл write.lock не может быть удален, поскольку я думаю миграция еще не завершена. Как я могу убедиться, что миграция выполнена, прежде чем использовать ее, не перенося ее за пределы Glassfish?
Есть ли способ получить эксклюзивную миграцию магазина в этом контексте? И если да, то как? И это решение моей проблемы?
EDIT 1 Добавлено сообщение об исключении.
EDIT 2 Все это происходит только тогда, когда загруженный граф ранее использовался с Neo4j 1.5, а теперь с разъемом Neo4j 1.8. когда граф создается соединителем, абсолютно никакой ошибки не происходит.
EDIT 3 Как ни странно, это происходит до тех пор, пока к этому коду не подключен отладчик: как только я пытаюсь его отладить, проблема перестает появляться. Это наводит меня на мысль, что может существовать механизм очистки миграции, который снимает блокировку записи после завершения миграции, и эта очистка не выполняется при использовании моего коннектора JCA neo4j. Это верное наблюдение?