2015-06-05 2 views
0

Я использую RDF-файл для хранения ссылок (URL-адресов) онлайн-ресурсов, которые разные пользователи добавляют по различным темам.несколько пользователей, обращающихся к файлу RDF для чтения и записи

Я использую Jena API для чтения и записи RDF-файла на сервере Apache.

Меня беспокоит то, что несколько пользователей могут одновременно входить в систему и могут одновременно взаимодействовать с файлом.

Мне интересно, может ли это вызвать какие-либо проблемы при обновлении файла, например, он каким-то образом повредит файл. Могу ли я продолжить это для живого приложения или это приведет к сбою моего приложения в результате доступа к 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

Посмотрите на Concurrency HowTo сайта Jena. Следуйте соответствующим ссылкам для транзакций TDB/SDB. В соответствии с документацией:

Замки обеспечивают поддержку критического сечения для управления взаимодействиями нескольких потоков в одной и той же JVM. Jena предоставляет поддержку параллелизма с несколькими считывателями/одиночными писателями (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() ; 
} 
+0

Большое спасибо за ответ. Я обновил вопрос с примера из моего кода для блокировок чтения и записи. Как вы думаете, я правильно понял понятие замков, и я могу сделать то же самое в своем коде, и это должно решить мою проблему. Я понимаю, что я могу использовать эти блокировки с файлами, и я должен прочитать блокировку кода, где я выполняю SPARQL и итерацию результатов. Я могу использовать блокировку записи, где я буду писать модель после обновления. Большое спасибо. – SotonJ

+0

это примерно правый. вы, возможно, захотите предоставить TDB/SDB, хотя они предлагают полную поддержку транзакций ACID. хранилище файлов, как в вашем примере, вероятно, полезно только для прототипирования/тестирования afaic. – chris

2

хранения файлов не предлагает соответствующие операции.

Возможны следующие варианты:

  1. Использование TDB transactions - потребности наборов данных
  2. Использование Concurrency HowTo - работает на моделях.
  3. Использование DatasetGraphWithLock - обеспечивает симуляцию транзакций на основе блокировки (несовершенный - без прерывания).

Если вы блокируете, помните, что запись файла не является атомарной. Крушение в середине письма оставляет половину файла позади. Напишите в один файл, а затем переименуйте его в конечное имя в том же каталоге.

+0

Благодарим вас за ответ. Итак, вы предлагаете, чтобы блокировки не использовались при использовании данных RDF в файлах RDF. Я уже видел, что файлы будут оставлены наполовину написанными. И поэтому я беспокоюсь, что могут быть проблемы с использованием файлов.Я обновил свой вопрос с примера из моего собственного кода для чтения и записи. Пожалуйста, совет, если я буду продолжать это. Максимум 20-22 человек будут использовать приложение одновременно. – SotonJ

Смежные вопросы