多个用户访问RDF文件以进行读写

时间:2015-06-05 14:49:17

标签: apache rdf jena rdfs

我正在使用RDF文件存储由不同用户添加的有关各种主题的在线资源的链接(URL)。

我正在使用Jena API在Apache服务器上读取和写入RDF文件。

我担心的是,多个用户同时允许登录系统并可能同时与该文件进行交互。

我想知道这是否会导致更新文件时出现任何问题,例如,它是否会以某种方式损坏文件。我是否可以将其用于实时应用程序,或者由于多个用户同时访问RDF文件以进行读写而导致应用程序崩溃。

我真的很感激帮助。

由于

 //updated code to understand answer.
 // Example of Locks for reading

File f = new File(fileName); 
InputStream in = new FileInputStream(f);

Model model = ModelFactory.createDefaultModel();                
model.read(in,null);
String queryString = "...";


model.enterCriticalSection(Lock.READ);  // use of lock
try {

     qe = QueryExecutionFactory.create(qry, model);
     rs = qe.execSelect();
     for ( ; rs.hasNext() ; )
     {
         //read literals
         //read literals
         out.println(....);
     }
     qe.close();

 } finally 
   {
     model.leaveCriticalSection() ;
   }

//******************************
// Example of Locks for WRITING


File fout = new File(fileName); 
Model model = ModelFactory.createDefaultModel();                
model.read(in,null);
OutputStream os = new FileOutputStream(fout);
// model updation
// new triplets. new data being added

model.enterCriticalSection(Lock.WRITE);  // use of lock
try {
             model.write(os);
    } finally 
   {
     model.leaveCriticalSection() ;
   }

os.close();

2 个答案:

答案 0 :(得分:2)

查看耶拿网站的Concurrency HowTo。关注TDB / SDB交易的相关链接。根据文件:

  

锁为管理交互提供关键部分支持   同一JVM中的多个线程。耶拿提供   多读者/单作者并发支持(MRSW)。

     

模式一般是:

Model model = . . . ;
model.enterCriticalSection(Lock.READ) ;  // or Lock.WRITE
try {
    ... perform actions on the model ...
    ... obey contract - no update operations if a read lock
} finally {
    model.leaveCriticalSection() ;
}

答案 1 :(得分:2)

文件存储不提供正确的交易。

选择是:

  1. 使用TDB transactions - 需要数据集
  2. 使用Concurrency HowTo - 适用于模特。
  3. 使用DatasetGraphWithLock - 提供基于锁定的交易模拟(不完美 - 无法中止)。
  4. 如果您锁定,请记住编写文件不是原子的。写作过程中的崩溃会使半个文件落后。写入一个文件,然后将其重命名为同一目录中的最终名称。