【问题标题】:check if org.jooq.exception.DataAccessException is serialization failure检查 org.jooq.exception.DataAccessException 是否为序列化失败
【发布时间】:2016-05-19 23:31:26
【问题描述】:

我在 Java 中收到一个带有消息的 org.jooq.exception.DataAccessException

错误:由于事务之间的读/写依赖关系,无法序列化访问 详细信息:原因代码:在检查冲突期间,在识别为枢轴时取消。 提示:重试交易可能会成功。

我想检查数据访问异常的错误代码,这是幕后的 Postgres 数据库。例如序列化失败异常错误码为40001

如何检查 org.jooq.exception.DataAccessException 的错误代码?

如果序列化失败,我的动机是重试事务。

【问题讨论】:

  • 你可以试试.getCause();通常原因是潜在的异常,如果幸运的话,这将是您的 PostgreSQL 特定异常。但是请注意,这会使您的代码不可移植...
  • @fge:SQL 状态不是 PostgreSQL 特定的,they're specified in the SQL standard...
  • @LukasEder 啊,很好,我不知道...
  • 是的。事实上,人们经常将 SQL 标准 SQL 状态 (SQLException#getSQLState()) 与供应商特定错误代码 (SQLException#getErrorCode()) 混淆

标签: java postgresql exception jooq


【解决方案1】:

在 jOOQ 3.8 中,引入了 SQLStateClassSQLStateSubclass (#4904),以便您可以安全地访问 SQL 标准 SQL 状态值。

catch (DataAccessException e) {
    System.out.println(e.sqlStateClass());
    System.out.println(e.sqlStateSubclass());

    if (SQLStateSubclass.C40001_SERIALIZATION_FAILURE == e.sqlStateSubclass()) {
        ...
    }
}

在 jOOQ 3.8 之前,您可以访问底层 SQLException 以访问这些 SQL 状态值:

catch (DataAccessException e) {
    if (e.getCause() instanceof SQLException &&
       ("40001".equals(((SQLException) e.getCause()).getSQLState()))) {
        ...
    }
}

【讨论】:

  • 谢谢卢卡斯。我确实检查了 instanceof SQlException。它奏效了。
猜你喜欢
  • 2011-07-06
  • 1970-01-01
  • 2012-07-11
  • 1970-01-01
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 2014-01-30
相关资源
最近更新 更多