调用 SQLException.getMessage() 时出现 RuntimeException (DB2)

Posted

技术标签:

【中文标题】调用 SQLException.getMessage() 时出现 RuntimeException (DB2)【英文标题】:RuntimeException when calling SQLException.getMessage() (DB2) 【发布时间】:2019-04-15 10:55:35 【问题描述】:

当使用 DB2 调用 SQLException.getMessage() 时,我们看到了 RunTimeException

Caused by: com.ibm.db2.jcc.am.ro: Q1D02E02;EXECUTE;SYSIBM.SQLCAMESSAGECCSID
    at com.ibm.db2.jcc.am.ed.a(ed.java:676)
    at com.ibm.db2.jcc.am.ed.a(ed.java:60)
    at com.ibm.db2.jcc.am.ed.a(ed.java:127)
    at com.ibm.db2.jcc.am.p.e(p.java:512)
    at com.ibm.db2.jcc.am.p.a(p.java:467)
    at com.ibm.db2.jcc.am.sn.a(sn.java:334)
    at com.ibm.db2.jcc.am.qm.c(qm.java:78)
    at com.ibm.db2.jcc.am.ro.getMessage(ro.java:52)

这可能是我的配置问题引起的,但getMessage() 肯定不应该抛出?

【问题讨论】:

哪个 Db2 驱动程序版本?哪个 Db2 服务器操作系统?是否设置了 jdbc 驱动程序属性“retrieveMessagesFromServerOnGetMessage”?如果已设置,并且您的 Db2 服务器在 Linux/Unix/Windows 上运行,那么它将调用存储过程,并且如果您的配置不正确,可能会引发异常,例如,如果连接的用户 ID 缺乏相关存储的执行权限程序 我会挖掘出细节(这不是我的系统)。但即使用户没有权限,该方法也不应该抛出,对吧? 您是否认真建议在这种情况下抛出 RunTimeException 是可以的? 如果 Db2-server 被询问 "please do x for user y" ,并且 Db2-server 未配置为允许用户 y 执行 x,则 Db2-server 似乎有效抛出异常。客户端(jdbc 驱动程序)当然可以选择它想要对该异常执行的操作,包括丢弃它……但这是 jdbc 驱动程序及其配置的问题,因此了解版本等的详细信息是必要的。 . 我同意。我要说的是,这显然是 JDB 驱动程序中的一个错误。是的,我会尝试获取有关具体版本的信息。 【参考方案1】:

如果 Db2 JDBC 驱动程序属性 retrieveMessagesFromServerOnGetMessage 设置为 true(非默认值),驱动程序将尝试通过调用存储过程 SYSIBM.SQLCAMESSAGESYSIBM.SQLCAMESSAGECCSID 从服务器检索完整的错误消息.

通常,这些过程的EXECUTE 权限将授予PUBLIC,但您的用户 ID Q1D02E02 似乎没有该权限。例如,如果数据库被创建为限制性的,或者如果特权被明确地从PUBLIC 撤销,则可能会发生这种情况。

要解决问题,请授予必要的权限或避免从数据库服务器检索错误消息。

【讨论】:

接受这个作为答案,因为它描述了如何解决问题。但是,我真正感兴趣的是这是否是 JDBC 驱动程序中的一个错误,以及它是否真的会被修复。 IBM? 显然这不是错误——如果您希望驱动程序与服务器通信,您必须显式启用此属性,您显然已经这样做了,所以问题出在您自己身上。跨度> @JulianReschke 我建议您在这个问题上与 IBM 建立 PMR。即使有 IBM 员工参与 SO,也不一定会被评估为缺陷,除非它存在于他们的系统中。 @IanBjorhovde - 这需要一份支持合同,对吧?

以上是关于调用 SQLException.getMessage() 时出现 RuntimeException (DB2)的主要内容,如果未能解决你的问题,请参考以下文章

java三种调用方式(同步调用/回调/异步调用)

LINUX系统调用

引用调用 vs 复制调用调用

RPC 调用和 HTTP 调用的区别

js方法调用

深入理解Java虚拟机——方法调用(解析调用)