【问题标题】:multiple users accessing RDF file for read and write多个用户访问 RDF 文件进行读写
【发布时间】:2019-07-26 16:52:03
【问题描述】:

我正在使用 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();

【问题讨论】:

    标签: java rdf jena rdfs


    【解决方案1】:

    看看耶拿网站的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() ;
    }
    

    【讨论】:

    • 非常感谢您的回答。我已经用我的代码中的例子更新了这个问题,用于读/写锁。你认为我正确地理解了锁的概念吗,我可以在我的代码中做同样的事情,这应该可以解决我的问题。我的理解是我可以将这些锁与文件一起使用,并且我应该在执行 SPARQL 和迭代结果集的代码周围阅读锁。我可以在更新后写模型的地方使用写锁。非常感谢。
    • 那是对的。不过,您可能想尝试一下 TDB/SDB,因为它们提供完整的 ACID 事务支持。您的示例中的文件存储可能仅对原型设计/测试 afaic 有用。
    【解决方案2】:

    文件存储不提供适当的交易。

    选择是:

    1. 使用TDB transactions -- 需要数据集
    2. 使用Concurrency HowTo -- 适用于模型。
    3. 使用DatasetGraphWithLock -- 提供基于锁的事务模拟(不完美 - 不会中止)。

    如果您锁定,请记住写入文件不是原子的。写入过程中的崩溃会留下半个文件。写入一个文件,然后将其重命名为同一目录中的最终名称。

    【讨论】:

    • 感谢您的回答。那么,您是否建议在 RDF 文件中使用 RDF 数据时不应该使用锁。我已经看到文件将只写一半。这就是为什么我担心使用文件可能会出现问题。我已经用我自己的代码中的示例更新了我的问题,用于读取和写入锁。请建议,如果我应该继续这样做。最多 20-22 人将同时使用该应用程序。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 2021-08-09
    • 2011-12-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多