【问题标题】:How to handle write errors in Apache Jena?如何处理 Apache Jena 中的写入错误?
【发布时间】:2017-02-03 08:13:59
【问题描述】:

假设我有以下代码用于将记录插入 Apache Jena 数据库 (TBD):

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.createResourceds.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()
    }
}

【问题讨论】:

    标签: java error-handling kotlin jena apache-jena


    【解决方案1】:

    我们怎么可能知道您的应用程序对这种失败的正确答案是什么?!

    说真的:这是您的项目、您的应用程序、您的要求。你必须清楚这类问题对你来说意味着什么。

    不过,“通用”是:

    1. 向系统用户提供反馈 - 很明显,一些非常核心的操作刚刚失败。您无法继续此操作;你甚至可能需要一些回滚。
    2. 有一些围绕故障情况的模式(如circuit breaker)可以为此类问题提供指导。换句话说:当你的数据库拒绝写入数据时,重要的东西可能会被破坏。您可能必须处理它;超出了在这种情况下失败的那个操作的范围。

    【讨论】:

    • 这个问题不是特定于应用程序的。有错误处理的一般规则。如果您读取或写入文件,则必须捕获一组标准异常(I/O、找不到文件)并在成功和失败情况下关闭流。如果使用 JDBC 将记录插入到关系数据库中,则需要回滚事务以防失败,并关闭语句。这些东西是通用的,不依赖于应用程序。我正在为 Apache Jena 寻找既定的最佳实践。
    • 调用ds.abort()(事实上,ds.end() 会为你做这件事——它会中止任何未提交的事务)。所以数据库清理了;数据库错误很严重(例如磁盘空间不足,JVM OOME),需要查看,但数据完好无损,只是没有更新。剩下的就是应用问题了。
    • @AndyS 这是否意味着我的代码正确处理了与持久性相关的错误?
    • 您的代码使用try-finally 处理事务OK。第一个版本不是因为它可以绕过ds.end()。代码还需要对写入事务失败的事实做出反应。
    猜你喜欢
    • 2021-05-17
    • 1970-01-01
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多