Как обрабатывать ошибки записи в Apache Jena?

Представьте, что у меня есть следующий код для вставки записи в базу данных Apache Jena (подлежит уточнению):

private fun createPersonLogic(ds: Dataset, email: String, nick: String) {
    ds.begin(ReadWrite.WRITE)
    val model = ds.defaultModel

    val uuid = UUID.randomUUID()
    val uri = "http://mycompany.com/data/p-${uuid}"
    val person = model.createResource(uri)
    person.addProperty(VCARD.EMAIL, email)
    person.addProperty(VCARD.N,
            model.createResource()
                    .addProperty(VCARD.NICKNAME, nick))
    ds.commit()
    ds.end()
}

Как правильно обрабатывать ошибки во время выполнения model.createResource и ds.commit -- как в приведенном ниже фрагменте кода или по-другому?

private fun createPersonLogic(ds: Dataset, email: String, nick: String) {
    try {
        ds.begin(ReadWrite.WRITE)
        val model = ds.defaultModel

        val uuid = UUID.randomUUID()
        val uri = "http://mycompany.com/data/p-${uuid}"
        val person = model.createResource(uri)
        person.addProperty(VCARD.EMAIL, email)
        person.addProperty(VCARD.N,
                model.createResource()
                        .addProperty(VCARD.NICKNAME, nick))
        ds.commit() 
    }
    catch (throwable:Throwable) {
        // react to the error
    }
    finally {
        ds.end()
    }
}

person Mentiflectax    schedule 03.02.2017    source источник


Ответы (1)


Откуда нам знать, какой правильный ответ в вашей заявке на такой отказ?!

Серьезно: это ваш проект, ваше приложение, ваши требования. Вы должны четко понимать, что такого рода проблемы значат для вас.

Тем не менее, «дженерик» это:

  1. Дайте отзыв пользователю системы - очевидно, какая-то очень важная операция просто не удалась. Вы не можете продолжить эту операцию; вам может даже понадобиться откат.
  2. Существуют шаблоны для аварийных ситуаций (например, автоматический выключатель), которые дают рекомендации по решению подобных проблем. . Другими словами: когда ваша база данных отказывается записывать данные, возможно, что-то важное не работает. Вам, вероятно, придется иметь дело с этим; выходит за рамки той операции, которая в данном случае не удалась.
person GhostCat    schedule 03.02.2017
comment
Вопрос не относится к конкретному приложению. Существуют общие правила обработки ошибок. Если вы читаете или пишете в файл, вы должны перехватывать стандартный набор исключений (ввод-вывод, файл не найден) и закрывать потоки как в случае успеха, так и в случае неудачи. Если вы вставляете запись в реляционную базу данных с помощью JDBC, вам необходимо откатить транзакцию в случае сбоя и закрыть оператор. Эти вещи являются общими и не зависят от приложения. Я ищу устоявшуюся передовую практику для Apache Jena. - person Mentiflectax; 03.02.2017
comment
Вызовите ds.abort() (фактически, ds.end() сделает это за вас - он прерывает любую незафиксированную транзакцию). Итак, база данных очищается; ошибка базы данных является серьезной (например, нехватка места на диске, JVM OOME), и ее необходимо проверить, но данные не повреждены, просто не обновлены. Остальное - проблема приложения. - person AndyS; 03.02.2017
comment
@AndyS Означает ли это, что мой код правильно обрабатывает ошибки, связанные с сохранением? - person Mentiflectax; 06.02.2017
comment
Ваш код обрабатывает транзакцию OK с помощью try-finally. Первая версия не потому, что может обойти ds.end(). Код также должен реагировать на тот факт, что транзакция записи не удалась. - person AndyS; 07.02.2017