2014-04-28 43 views
0

我使用的Neo4j 1.9.4用於一個項目,我碰到一個奇怪的現象:設置Neo4j的緩存

我有這樣的一段代碼,效果很好。我已經設置了一個常青藤文件的類路徑,一切都很好。

public static void main(String[] args) { 
    // the cache providers 
    ArrayList<CacheProvider> cacheList = new ArrayList<CacheProvider>(); 
    System.out.println("Creating db configuration"); 
    cacheList.add(new SoftCacheProvider()); 

    // the kernel extensions 
    LuceneKernelExtensionFactory lucene = new LuceneKernelExtensionFactory(); 
    List<KernelExtensionFactory<?>> extensions = new 
     ArrayList<KernelExtensionFactory<?>>(); 
    extensions.add(lucene); 

    // the database setup 
    GraphDatabaseFactory gdbf = new GraphDatabaseFactory(); 
    gdbf.setKernelExtensions(extensions); 
    gdbf.setCacheProviders(cacheList); 
    GraphDatabaseService db = gdbf.newEmbeddedDatabase("/tmp/test"); 
} 

問題是,當我試圖改變cacheList.add(new SoftCacheProvider())爲​​我得到以下錯誤:

java.lang.IllegalArgumentException: No provider for cache type 'soft'. Cache providers are loaded using java service loading where they register themselves in resource (plain-text) files found on the class path under META-INF/services/org.neo4j.kernel.impl.cache.CacheProvider. This missing provider may have been caused by either such a missing registration, or by the lack of the provider class itself. 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.create(InternalAbstractGraphDatabase.java:356) 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:252) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:106) 
    at org.neo4j.graphdb.factory.GraphDatabaseFactory$1.newDatabase(GraphDatabaseFactory.java:88) 
    at org.neo4j.graphdb.factory.GraphDatabaseBuilder.newGraphDatabase(GraphDatabaseBuilder.java:207) 
    at org.neo4j.graphdb.factory.GraphDatabaseFactory.newEmbeddedDatabase(GraphDatabaseFactory.java:69) 
    at ttt.App.main(App.java:34) 

也有同樣的錯誤,如果我嘗試使用NoChacheProvider或StrongCacheProvider。

我試圖添加文件META-INF/services/org.neo4j.kernel.impl.cache.CacheProvider以下內容,但它不會改變任何東西。

org.neo4j.kernel.impl.cache.WeakCacheProvider 
org.neo4j.kernel.impl.cache.SoftCacheProvider 
org.neo4j.kernel.impl.cache.NoCacheProvider 
org.neo4j.kernel.impl.cache.StrongCacheProvider 

你知道發生了什麼嗎?我不明白爲什麼只有一個緩存提供程序類型正在工作。

請注意,我必須使用Neo4j 1.9.4,我無法更改它。

編輯:我的項目是沒有任何其他的依賴條件

EDIT2一個基本的Eclipse插件項目:一個其他有趣的一點是,如果我嘗試配置了Map<String,String>我得到同樣的錯誤的數據庫,甚至<"cache_type","soft">

public static void main(String[] args) { 
    Map<String,String> config = new HashMap<String,String>(); 
    config.put("cache_type", "soft"); 
    GraphDatabaseService db = null; 
    db = new EmbeddedGraphDatabase("/tmp/test", config, Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST, Collections.EMPTY_LIST); 
} 

java.lang.IllegalArgumentException: No provider for cache type 'soft'. Cache providers are loaded using java service loading where they register themselves in resource (plain-text) files found on the class path under META-INF/services/org.neo4j.kernel.impl.cache.CacheProvider. This missing provider may have been caused by either such a missing registration, or by the lack of the provider class itself. 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.create(InternalAbstractGraphDatabase.java:356) 
    at org.neo4j.kernel.InternalAbstractGraphDatabase.run(InternalAbstractGraphDatabase.java:252) 
    at org.neo4j.kernel.EmbeddedGraphDatabase.<init>(EmbeddedGraphDatabase.java:106) 
    at ttt.App.main(App.java:36) 

回答

2

什麼嘗試直接在配置中指定,像這樣:

GraphDatabaseService db = gdbf.newEmbeddedDatabaseBuilder('path/to/db').setConfig(GraphDatabaseSettings.cache_type, WeakCacheProvider.NAME).newGraphDatabase() 

當然,我還沒有在1.9.4試過,但是,也許這是值得一試。

+0

非常感謝!我仍然不明白爲什麼它工作,而其他兩種方法沒有,但似乎是做這項工作:) – zelus