2015-08-03 111 views
1

在我的機器中,base/data目錄包含多個存儲庫。但是當我從java程序訪問這個數據目錄時,它只給我提供SYSTEM存儲庫記錄。SYSTEM存儲庫未顯示存儲庫詳細信息

代碼檢索庫:

String dataDir = "D:\\SesameStorage\\data\\" 
LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir)); 
localManager.initialize(); 

// Get all repositories 

Collection<Repository> repos = localManager.getAllRepositories(); 

System.out.println("LocalRepositoryManager All repositories : " 
       + repos.size()); 
for (Repository repo : repos) { 
    System.out.println("This is : " + repo.getDataDir()); 

    RepositoryResult<Statement> idStatementIter = repo 
      .getConnection().getStatements(null, 
        RepositoryConfigSchema.REPOSITORYID, null, 
        true, new Resource[0]); 
    Statement idStatement; 
    try { 
     while (idStatementIter.hasNext()) { 
      idStatement = (Statement) idStatementIter.next(); 
      if ((idStatement.getObject() instanceof Literal)) { 
       Literal idLiteral = (Literal) idStatement 
         .getObject(); 
       System.out.println("idLiteral.getLabel() : " 
         + idLiteral.getLabel()); 
      } 
     } 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 

Output :  
LocalRepositoryManager All repositories : 1 
This is : D:\SemanticStorage\data\repositories\SYSTEM 
idLiteral.getLabel() : SYSTEM 

添加存儲庫LocalRepositoryManager:

String repositoryName = "data.ttl"; 

RepositoryConfig repConfig = new RepositoryConfig(repositoryName); 
SailRepositoryConfig config = new SailRepositoryConfig(new MemoryStoreConfig()); 
repConfig.setRepositoryImplConfig(config); 
manager.addRepositoryConfig(repConfig); 

獲取庫對象:

Repository repository = manager.getRepository(repositoryName); 
repository.initialize(); 

我已經成功添加新的存儲庫,以LocalRepositoryManager和它顯示我的存儲庫數量爲2.但是當我重新啓動該應用程序僅向我顯示一個存儲庫,即SYSTEM存儲庫。

我的SYSTEM存儲庫沒有得到更新,請告訴我,我應該如何在我的LocalRepositoryManager對象中加載該數據目錄。

+0

我NativeStoreConfig也試過,但沒有奏效。 – sagarg

回答

0

你還沒有提供全面的測試用例,只是單獨的代碼片段沒有明確指示它們被執行的順序,這使得很難弄清楚到底發生了什麼問題。

但是,我會冒險猜測,問題是您沒有正確關閉和關閉資源。首先你獲得RepositoryConnection的而沒有將其關閉:

RepositoryResult<Statement> idStatementIter = repo 
     .getConnection().getStatements(null, 
       RepositoryConfigSchema.REPOSITORYID, null, 
       true, new Resource[0]); 

您需要將其更改爲這樣的事情:

RepositoryConnection conn = repo.getConnection(); 
    try { 
    RepositoryResult<Statement> idStatementIter = 
       conn.getStatements(null, 
        RepositoryConfigSchema.REPOSITORYID, null, 
        true, new Resource[0]); 

    (... do something with the result here ...) 
    } 
    finally { 
    conn.close(); 
    } 

順便說一句:如果你的目標是檢索資料庫元信息(id,title,location),上面的代碼太複雜了。沒有必要打開連接到SYSTEM存儲庫來讀取這些信息,你可以直接從RepositoryManager獲得這些東西。例如,你可以簡單地做檢索存儲庫標識符的列表:

List<String> repoIds = localManager.getRepositoryIDs(); 

for (String id: repoIds) { 
     System.out.println("repository id: " + id); 
} 

或者,如果你想也得到了文件的位置和/或描述,使用方法:

Collection<RepositoryInfo> infos = localManager.getAllRepositoryInfos(); 
for (RepositoryInfo info: infos) { 
     System.out.println("id: " + info.getId()); 
     System.out.println("description: " + info.getDescription()); 
     System.out.println("location: " + info.getLocation()); 
} 

另外一個問題你代碼是,我懷疑你永遠不會正確呼叫manager.shutDown()也不repository.shutDown()。在程序退出時調用這些函數可以讓管理器和存儲庫正確關閉資源,保存狀態並正常退出。既然你自己創建了一個RepositoryManager對象,你也需要關心自己在程序退出時這麼做。

創建自己的RepositoryManager對象的替代方法是改用RepositoryProvider(另請參見Sesame Programmers Manual中的相關章節)。這是一個帶有內置關機鉤子的實用程序類,使您不必處理這些管理器/存儲庫關閉問題。

因此,不是這樣的:

LocalRepositoryManager localManager = new LocalRepositoryManager(new File(dataDir)); 
localManager.initialize(); 

這樣做:

LocalRepositoryManager localManager = 
     RepositoryProvider.getRepositoryManager(new File(datadir)); 
+0

謝謝Jeen。我將使用RepositoryProvider而不是LocalRepositoryManager。 – sagarg

+0

不用擔心。順便說一句,不要在評論中感謝我,如果您投票或接受對您有用的答案會更好。有關更多詳細信息,請參閱StackOverflow幫助部分。 –