2013-04-08 68 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

相關問題