2013-04-08 31 views
0

我通过Alex Smirnov neo4j JCA连接器的修改版本在glassfish服务器中使用neo4j。 我的版本可在这里找到:https://github.com/Riduidel/neo4j-connector 我使用这个连接器与neo4j 1.8。因此,当我想要使用它时,首先在我的Glassfish应用程序服务器中安装连接器,然后在希望连接到的应用程序中使用此连接器。当allow_store_upgrade失败时我能做些什么?

在新鲜商店中使用它可以正常工作。 但是,当与以前版本创建的商店一起使用时,我会遇到奇怪的错误。

通常情况下,我今天得到了下面的堆栈

javax.resource.spi.ResourceAllocationException: Error in allocating a connection. Cause: Failed to transition org.neo4j.ke[email protected]3bbd53b1 from NONE to STOPPED 
... 
... 
.../* JCA internal exception stack */ 
... 
... 
Caused by: com.sun.appserv.connectors.internal.api.PoolingException: Failed to transition org.neo4j.ke[email protected]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.ke[email protected]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之外?

有没有办法在这种情况下独家商店迁移?如果是这样,怎么样? 这是我的问题的解决方案?

编辑1添加了异常消息。

编辑2所有这些只有在加载图形以前与Neo4j 1.5一起使用并且现在使用Neo4j 1.8连接器时才会发生。当图形由连接器创建时,绝对不会发生错误。

编辑3奇怪的是,只要没有调试器插入该代码,就会发生这种情况:只要我尝试调试它,问题就会停止显示。这让我想到可能会有一个迁移清除机制,一旦迁移完成后就提取写锁,并且在使用我的neo4j JCA连接器时不会执行此清理。这是一个有效的观察?

+0

清理写锁定发生在任何检查升级任何事情之前。在这种情况下,我看不到升级的连接。调试时不出现的事实也很奇怪。因此,在调试模式下成功启动和关闭后,再次启动时不起作用? – 2013-04-11 07:24:04

回答

0

经过进一步调查,事实表明不是多次调用EmbeddedGraphDatabase构造函数,而是加载多个identicail IndexProvider

我使用嵌入在开源JCA连接器中的neo4j。 在此连接器中,org.neo4j.kernel.Service类被替换为a custom one,其中包含有关JBoss非共享库的服务加载的解决方法。 不幸的是,在我们的背景下,这一解决办法意味着加载两次指数提供商:

  1. 一次使用EAR类加载器
  2. 一次使用的是GlassFish库的类加载器。

为什么? 因为我们的neo4j实例正在使用应用程序数据和身份验证,所以neo4j连接器jar放在${domain}/lib中。因此,由于应用程序服务器中的类加载器委派,EAR类加载器委托给Glassfish库类加载器,并以这种方式找到LuceneIndexProvider。然后,Glassfish库类加载器直接用于加载类相同的LuceneIndexProvider类。

由此我们得出两个LuceneIndexProvider对象,它们都试图迁移lucene索引。导致AssertionError作为第一个对象创建的write.lock文件应该被第二个删除,这不能做到这一点。

然后,我已经稍微改变了非常特定的类,只有当默认加载机制不返回任何类时才使用JBoss解决方法(seee commit here)。这个小小的改变像魅力一样,所以我认为你可以把这个问题视为固定的。

1

我对JCA连接器不太熟悉,但可以肯定的是,我只写了一个非常小的迁移java类,它可以打开数据库,让它迁移并关闭。然后用JCA连接器再试一次?

+0

对不起,我刚刚添加了初始异常消息。 – Riduidel 2013-04-08 13:18:52

+0

或使用'neo4j-shell -path path/to/db -config config-with-allow-auto-upgrade-neo4j.properties' – 2013-04-09 06:45:33

+0

@MichaelHunger by doin,所以我不会使用嵌入式neo4j来执行我的迁移,而是一个外部的。对 ?不幸的是,我想要的是从我的neo4j连接器自动迁移。我没有说这是一个糟糕的解决方案,只是这个解决方案非常适合测试。实际上这个解决方案的最大缺点是它需要我在应用程序部署的每台机器上部署独立的neo4j实例......奇怪的是,考虑到我的连接器包含一个工作的neo4j内核。 – Riduidel 2013-04-09 08:14:47

相关问题