【问题标题】:Jdbc check for capability - savepoint releaseJdbc 检查功能 - 保存点发布
【发布时间】:2012-05-26 21:26:37
【问题描述】:

我有适用于各种数据库的通用 jdbc 代码。 我有一些适用于事务和保存点的 api。

问题是有些数据库需要你手动释放保存点

 conn.releaseSavepoint(savepoint1) 

当您手动发布时,有些只是抛出异常(最显着的是 Oracle)。

如何在运行时检查数据库是否具有自动保存点释放或者我是否需要这样做 手动。并且请,我有一些不错的 api。我不想捕捉异常,这很丑陋 在这种情况下容易出错。抛出的异常是java.sql.SqlException,而不是“FeatureUnsupportedException”。因此,如果有一个真正的错误并且我愚蠢地抓住了它,那么我可能会在整个交易过程中完全失败。

谢谢

【问题讨论】:

  • 你已经说过你不想听到这个,但我认为捕捉异常是你最好的选择
  • Javadoc 说如果不支持它会抛出 SQLFeatureNotSupportedException。现在,如果实现符合 API,那就另当别论了。
  • @Luciano 你是对的! Oracle 决定将他们所有的数据库异常包装在 SqlException 中。但如果我抓住它,请检查“原因”字段。如果它是 SQLFeatureNotSupportedException 工作它,否则把它扔回去!谢谢你,你给了我迄今为止最好的主意。
  • @Luciano 遗憾的是,甚至原因也包含在 SQLException 中。现在,我将完全跳过手动发布。但我不喜欢它...

标签: java database oracle jdbc savepoints


【解决方案1】:

In Oracle's 10g documentation,我发现不支持这种特定的 JDBC / ojdbc 方法:

注意: 从 Oracle 数据库 10g 开始,不支持 releaseSavepoint 和 oracleReleaseSavepoint。如果您调用其中任何一种方法,则会引发 SQLException 并显示消息“不支持的功能”。

在 11g 中,the documentation seems to claim 否则:

您使用 Connection.releaseSavepoint(Savepoint svpt) 方法删除保存点。

但我也可以在 11g 中轻松重现您的问题。

【讨论】:

    【解决方案2】:

    如果您可以将数据库供应商参数传递到您的类中,那么您可以简单地为每个供应商映射此行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-11-09
      • 2023-03-19
      • 2023-01-18
      • 2017-02-25
      • 1970-01-01
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多