DB2 数据库的数据访问问题
本文提供访问 DB2® 数据库的故障诊断技巧。
访问 DB2 数据库时您遇到哪类问题?
- 连接到数据库时发生 Kerberos 登录错误
- SQL0567N “DB2ADMIN”是无效授权标识。SQLSTATE=42602
- SQL0805N 未找到软件包 package-name
- SQL0805N 未找到软件包“NULLID.SQLLC300”。SQLSTATE=51002
- SQL30082N 由于安全原因“17”(“UNSUPPORTED FUNCTION”),尝试建立连接失败 SQLSTATE=08001
- Java 发生 SQLException,返回 ErrorCode -99,999 和 SQLState 58004
- 错误消息 java.lang.reflect.InvocationTargetException: com.ibm.ws.exception.WsException: DSRA0023E
- CLI0119E 系统错误
- COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0911N
- “找不到对应数据源(“[data-source-name]”)的 COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource”
尝试发布或查询其中一个字段超过 255 个字符的实体时返回错误 10500 (E_Fatal)
- java.sql.SQLException: 装入 T2 本机库文件时出现故障 db2jcct2 DSRA0010E: SQL 语句 = null,错误代码 = -99,999
- 数据源实现类型为 XA 时数据库中发生锁定争用异常
- 尝试在混合发行版单元中使用 DB2 通用数据源时发生“DSRA8050W: 无法找到指定的 DataStoreHelper 类”异常
- 尝试访问同时安装了 WebSphere Application Server 的 Windows 机器上的 DB2 时,发生错误“‘SYSTEM’ 是无效授权标识”
- 在一个阶段事务回滚后,DB2 通用 JDBC 驱动程序类型 4 中的 XA 准备调用上发生 XAException: XAER_NOTA
- 由于 JDBC 驱动程序文件版本不兼容导致对应用程序客户机记录 java.rmi.MarshalException
- 数据库故障导致对使用 DB2 通用驱动程序类型 4 的应用程序触发有问题的 -99999 异常
- 使用 DB2 通用 JDBC 驱动程序时无法访问 Linux 上的 DB2
- 容器管理的持久性 bean 中任何 VARCHAR FOR BIT DATA 列上发生非法转换
连接到数据库时发生 Kerberos 登录错误
- Enterprise JavaBeans (EJB) 3.0 bean 中的注入语句为属性级别。
- persistence.xml 文件未调出与您连接的数据库相关的元数据信息。
- 数据源上的组件管理的别名无效。
- 数据库设置为使用一次性安全性机制,例如,典型用户标识和密码机制以外的机制,如 Kerberos。
在 EJB 3.0 bean 的注入期间,Java Persistence API (JPA) persistence.xml 文件尝试连接到数据库以查找元数据。要进行连接,Java™ 2 连接器 (J2C) 从安全上下文中请求主体集。在此方案中,未调用为将信息放入安全上下文中而调用的安全性协作 API,并且返回的主体集中不包含 GSSCredentials。
调用应在 EJB 容器中进行,但 EJB 容器未调用协作 API,因为安全性 API 需要的完全构建 bean 不存在。此外,EJB 3.0 规范明确说明,bean 构建不应在已定义的安全上下文中进行。由于安全性 API 的设计和 EJB 3.0 规范的指导,EJB 容器未调用安全性协作 API,因此,安全上下文不知道要设置主体集,并且 GSSCredentials 不存在。
缺少 GSSCredentials 导致关系资源适配器 (RRA) 实现使用错误的代码路径;与告知 DB2 使用 GSSCredential 连接相反,它将使用与组件管理的别名相关联的标识。结果是,组件管理的别名配置为对 Kerberos 未知的标识;因此,当 DB2 驱动程序将此标识中继转发到数据库时,会发生错误。
Caused by: javax.security.auth.login.FailedLoginException: Login error: com.ibm.security.krb5.KrbException, status code: 6
message: Client not found in Kerberos database
at com.ibm.security.jgss.i18n.I18NException.throwFailedLoginException(I18NException.java:25)
at com.ibm.security.auth.module.Krb5LoginModule.b(Krb5LoginModule.java:733)
at com.ibm.security.auth.module.Krb5LoginModule.c(Krb5LoginModule.java:610)
at com.ibm.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:433)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:45)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:37)
at java.lang.reflect.Method.invoke(Method.java:599)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:795)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:209)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:709)
at java.security.AccessController.doPrivileged(AccessController.java:251)
at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java:706)
at javax.security.auth.login.LoginContext.login(LoginContext.java:603)
at com.ibm.db2.jcc.a.ud.a(ud.java:25)
- 确保注入语句处于“类级别”。
这样可以防止您在创建 bean 时尝试进行注入。持久性上下文项仍然存储在 Java 命名和目录接口 (JNDI) 中,但不会将这些项放入 bean 对象上的局部变量中。bean 方法从 JNDI 查找这些持久性上下文项,到那时为止,该 bean 应当运行在正确的安全上下文中,因为 EJB 容器已调用安全性协作 API。
- 使 persistence.xml 文件调出数据库元数据信息。
如果 persistence.xml 文件调出所需数据库元数据信息,那么 JPA 无需连接到数据库以获取这些信息。这意味着直到访问 bean 方法时才会进行连接。通过此步骤,安全上下文已正确设置,并且连接可用。
- 验证数据源上的组件管理的别名。
当 JPA 为收集元数据而尝试连接到数据库时,驱动程序回退为使用数据源上设置的组件管理的别名,因为安全上下文尚未配置。如果确保验证组件管理的别名,那么连接将成功。
- 不要将一次性安全性机制用于数据库安全性。
如果要使用一次性安全性机制,如 Kerberos,那么这不是可选项。如果数据库未配置为接受标准用户标识和密码认证,那么此问题不会发生。仅当您的系统需要特殊安全性配置时才会发生此问题。
SQL0567N “DB2ADMIN”是无效授权标识。SQLSTATE=42602
- 验证管理控制台的数据源属性页面中您的用户名和密码是否正确。
- 确保该用户标识和密码之前、中间或之后均不包含空白字符。
SQL0805N 未找到软件包 package-name
- 如果软件包名称是 NULLID.SQLLC300,请参阅 SQL0805N 未找到软件包“NULLID.SQLLC300”。SQLSTATE=51002。以获得原因。
- 您正尝试在非 XA 就绪的 DB2 数据库上使用支持 XA 的 JDBC 驱动程序。
- DB2 bind @db2ubind.lst blocking all grant public
- DB2 bind @db2cli.lst blocking all grant public
db2ubind.lst 和 db2cli.lst 文件位于 DB2 安装根的 bnd 目录中。从该目录运行命令。
SQL0805N 未找到软件包“NULLID.SQLLC300”。SQLSTATE=51002
- 底层数据库已被删除并且重新创建。
- DB2 已升级且它的软件包未正确地重新绑定。
要解决此问题,请通过运行 bnd 目录中的 db2cli.lst 脚本,重新绑定 DB2 软件包。例如:db2>@db2cli.lst。
SQL30082N 由于安全原因“17”(“UNSUPPORTED FUNCTION”),尝试建立连接失败 SQLSTATE=08001
- 客户机将新密码值发送给了不支持更改密码功能的服务器。
- 客户机将 SERVER_ENCRYPT 认证信息发送给了不支持密码加密的服务器。
- 客户机将用户标识但不带密码发送给了不支持仅通过用户标识认证的服务器。
- 客户机未指定认证类型,且服务器未用支持的类型响应。这会包括返回客户机无法从中选择的多种类型的服务器。
要解决此问题,确保您的客户机和服务器使用同一安全性机制。例如,如果这是有关您的数据源的错误,那么验证您是否已指定用户标识和密码或认证别名。
Java 发生 SQLException,返回 ErrorCode -99,999 和 SQLState 58004
使用 WAS40-type 数据源时,发生 SQLException,返回 ErrorCode -99,999 和 SQLState 58004:Java™“StaleConnectionException: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0119E 发生意外系统故障。SQLSTATE=58004”
- 提供了无效的用户名或密码。
- 数据库名称不正确。
- 某些 DB2 软件包已损坏。
2002-07-26-14.19.32.762905 Instance:db2inst1 Node:000
PID:9086(java) Appid:*LOCAL.db2inst1.020726191932
XA DTP Support sqlxa_open Probe:101
DIA4701E Database "POLICY2" could not be opened
for distributed transaction processing.
String Title: XA Interface SQLCA PID:9086 Node:000
SQLCODE = -1403
- 更正您的用户名和密码。如果在 GUI 上为数据源指定密码,那么确保在 bean 上指定的用户名和密码是正确的。在 bean 上指定的用户名和密码会覆盖创建数据源时所指定的内容。
- 使用正确的数据库名称。
- 按如下所示重新绑定软件包(在 bnd 目录):
db2connect to dbname c:\SQLLIB\bnd>DB2 bind @db2ubind.lst blocking all grant public c:\SQLLIB\bnd>DB2 bind @db2cli.lst blocking all grant public
- 确保 \WebSphere\AppServer\properties\wsj2cdpm.properties 文件具有正确的用户标识和密码。
错误消息 java.lang.reflect.InvocationTargetException: com.ibm.ws.exception.WsException: DSRA0023E
错误消息 java.lang.reflect.InvocationTargetException: com.ibm.ws.exception.WsException: DSRA0023E: 找不到数据源实现类“COM.ibm.db2.jdbc.DB2XADataSource”。尝试访问 DB2 数据库时
此异常的一个可能原因是用户尝试使用 JDBC 2.0 数据源,但是 DB2 不支持 JDBC 2.0。新安装 DB2 时会经常发生此情况,因为 DB2 为 JDBC 1.X 和 2.0 提供不同的驱动程序,而物理文件名相同。缺省情况下,JDBC 1.X 驱动程序位于类路径中。
- 在 Windows 系统上,从 DB2 安装根中的 java12 目录中查找 inuse 文件。如果缺少此文件,那么说明您正在使用 JDBC 1.x 驱动程序。
- 在 AIX® 或 Linux 等操作系统上,检查数据源的类路径。如果类路径未指向 java12 目录中的 db2java.zip 文件,那么说明您正在使用 JDBC 1.x 驱动程序。
- 在 Windows 系统上,停止 DB2。从 DB2 安装根的 java12 目录运行 usejdbc2.bat 文件。从命令行运行此文件以验证它是否成功完成。
- 在 AIX 或 Linux 等操作系统上,将数据源的类路径更改为指向 DB2 安装根的 java12 目录中 db2java.zip 文件。
CLI0119E 系统错误
CLI0119E 系统错误。SQLSTATE=58004 - DSRA8100 : 无法获得 XAconnection 或 DSRA0011E: 异常: COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver] CLI0119E 意外的系统故障。SQLSTATE=5800
- 在管理控制台的数据源属性页面上,验证对数据源指定了正确的数据库名称。
- 在定制属性页面上,检查用户名和密码定制属性。验证它们是否正确。
- 确保该用户标识和密码之前、中间或之后均不包含任何空白字符。
- 检查存在应用程序 的 WAS.policy 文件,例如,D:\WebSphere\AppServer\installedApps\markSection.ear\META-INF\was.policy。
- 查看整个异常列表以获得底层 SQL 错误,并使用 DBM 提供商消息参考来查找。
如果在 Red Hat Linux 上运行 DB2 时遇到此错误,那么表明系统范围内的最大队列数参数设置得过低,不支持 DB2 获得必需的资源来完成此事务。存在此问题时,异常 J2CA0046E 和 DSRA0010E 会在异常 DSRA8100E 之前。
要纠正此问题,编 辑 /proc/sys/kernal/msgmni 文件以将最大队列系统范围参数的值增加到大于 128。
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0911N
ERROR CODE: -911
COM.ibm.db2.jdbc.DB2Exception: [IBM][CLI Driver][DB2/NT] SQL0911N
由于死锁或超时,已回滚当前事务。
原因码“2”。SQLSTATE=40001
- 执行以下 DB2 命令:
- db2 update monitor switches using LOCK ON
- db2 get snapshot for LOCKS on dbName >
- 通过运行以下命令关闭锁定监视器:db2 update monitor switches using LOCK OFF
- 查找具有锁定等待状态的应用程序句柄,然后查找保持锁定的代理程序标识以验证代理程序的标识。
- 转至该句柄以验证它是否具有锁定等待状态和对此句柄保持锁定的代理程序标识。如果它具有与先前的句柄相同的代理程序标识,那么您知道您具有循环锁定(死锁)。
- 如果不需要并发访问,那么检查应用程序并使用较小限制的隔离级别。
- 当更改 accessIntent 值以改变成较低的隔离级别时要小心使用。此更改会导致数据完整性问题:
- 对于 DB2/UDB V7.2 及更低的发行版,您可以从 DB2 命令行窗口设置 DB2_RR_TO_RS 标志以消除不必要的死锁,例如,当 bean 方法上定义的 accessIntent 限制性过强时(如 PessimisticUpdate)。DB@_RR_TO_RS 设置具有两个影响:
- 如果 RR 是您选择的隔离级别,它有效地降低为 RS。
- 如果选择另一个隔离级别并且 DB2_RR_TO_RS 设置为开,那么扫描跳过已删除但未落实的行,即使此行可能有扫描资格。跳跃行为影响 RR、读稳定性 (RS) 和游标稳定性 (CS) 隔离级别。
例如,考虑事务 A 删除带有 column1=10 的行并且事务 B 在 column1>8 和 column1<12 上扫描的情况。DB2_RR_TO_RS 关闭时,事务 B 等待事务 A 落实或回滚。如果事务 A 回滚,column1=10 的行包 含在事务 B 查询的结果集中。DB2_RR_TO_RS 打开时,事务 B 不等待事务 A 落实或回滚。事务 B 立即接 收不包含已删除行的查询结果。设置 DB2_RR_TO_RS 有效地更改锁定行为,因此避免死锁。
“找不到对应数据源(“[data-source-name]”)的 COM.ibm.db2.jdbc.DB2ConnectionPoolDataSource”
此错误用消息“DSRA8040I: 未能连接到数据源”表示。
当 DB2 JDBC 驱动程序的类路径正确地设置为 ${DB2_JDBC_DRIVER_PATH}/db2java.zip,但未设置环境变量 DB2_JDBC_DRIVER_PATH 时,通常会发生此错误。
如果使用 DB2 V7.1 或 7.2 且还未运行 usejdbc2,那么也可能会发生此错误。如果路径正确但仍然会接收到此错误,那么说明这可能是个问题。
- 转至“管理 WebSphere 变量”页面。
- 选择环境以验证是否没有变量 DB2_JDBC_DRIVER_PATH 条目。
要纠正此问题,请执行以下操作:添加变量 DB2_JDBC_DRIVER_PATH,该变量的值等于包含 db2java.zip 文件的目录路径。
![[z/OS]](../images/ngzos.gif)
尝试发布或查询其中一个字段超过 255 个字符的实体时返回错误 10500 (E_Fatal)
当您尝试发布或查询它的一个字段超过 255 个字符的实体时,通常会发生此错误。使用非英语字符时这个问题不明显,因为显示 255 个可视字符之前就达到了实限制。
要纠正此问题:将它作为在 z/OS® 上使用 DB2 V7 时的一个限制接受。不要超过 255 个字符限制。
java.sql.SQLException: 装入 T2 本机库文件时出现故障 db2jcct2 DSRA0010E: SQL 语句 = null,错误代码 = -99,999
- 安装 DB2 后机器未重新引导。重新引导报告错误的机器并再试一次。
- 执行的数据库操作与配置的数据源使用不同的作用域。例如,对于存在于服务器级别上的数据源,testConnection 命令在节点级别上运行。将机器上的 db2profile 脚本作为数据源,并确保环境包含指向 DB2 本机库的指针。db2profile 脚本位于 DB2 用户标识的根目录中。有关 testConnection 命令的更多信息,请参阅“测试连接服务”。
- 没有为运行 WebSphere Application Server 的用户正确地设置 DB2 上下文。将机器上的 db2profile 脚本作为数据源,并确保环境包含指向 DB2 本机库的指针。
数据源实现类型为 XA 时数据库中发生锁定争用异常
症状 | 问题 | 描述 | 建议响应 |
---|---|---|---|
在应用程序通过实现类型 XA 的数据源访问的 DB2 数据库中发生锁定争用异常。 | 应用程序尝试访问 XA 事务锁定的数据库记录,此事务的状态为已结束,但无法通过事务管理器准备。 | 结束但无法就绪的 DB2 XA 事务的状态为已结束 (e)。因为不将其视为“不确定”,所以事务管理器无法恢复此事务。DB2 不会在不确定事务的列表中返回该事务。 DB2 也不会立即回滚该事务;它一直等到数据库的所有连接都释放。在此不活动期间,该事务继续持有数据库的锁定。例如,如果应用程序服务器不断开来自数据库的所有连接以允许进行回滚,那么已终止的事务仍然锁定同一数据库记录。如果应用程序尝试访问这些已锁定的记录,那么 DB2 中会发生锁定争用异常。 |
DB2 V8.2 附带了一个样本应用程序,它连接到定义的 DB2 服务器并使用可用的 DB2 API 以获取 这些特定已结束事务的列表。此应用程序提供了使您能指定一个时间的配置设置,过了这个时间此应用程序 就会回滚这些事务。在 DB2 V8.2 的 sqllib/samples/db2xamon.c 目录中找到此样本应用程序并运行。 |
尝试在混合发行版单元中使用 DB2 通用数据源时发生“DSRA8050W: 无法找到指定的 DataStoreHelper 类”异常
当将 WebSphere Application Server V6.0 或更高版本与先前版本结合使用,并尝试在先前版本上创建 DB2 通用数据源时,通常会发生此错误。
发生此错误的原因可能是,在 V5 和先前版本中 DB2 通用数据源不可用,但 V6 管理控制台允许您构建该数据源。
要纠正此问题:在 V6.0 或更高版本上创建数据源。
尝试访问同时安装了 WebSphere Application Server 的 Windows 机器上的 DB2 时,发生错误“‘SYSTEM’ 是无效授权标识”
尝试访问同时安装了 WebSphere Application Server 的 Windows 机器上的 DB2 时,显示错误消息“‘SYSTEM’ 是无效授权标识”
症状 | 问题 | 描述 | 建议响应 |
---|---|---|---|
对于使用 DB2 作为后端的 Windows 安装上的 WebSphere Application Server,在 JVM 日志中会看到以下异常:
|
对于 WebSphere Application Server 是 DB2 服务器的客户机的配置,会发生此异常。根本问题是当应用程序尝试在不提供用户标识和密码的情况下连接至 DB2 时,Windows 上的 WebSphere Application Server 与 DB2 之间发生授权冲突。 | 当 DB2 客户机和 DB2 数据库在同一台机器上运行时,DB2 允许客户机无须提供用户标识和密码就可以进行连接。连接在拥有客户机进程(在此示例中为应用程序服务器 JVN)的用户的凭证下进行。但是,如果 WebSphere Application Server 作为 Windows 服务运行,并且“登录方式”选项设置为“本地系统帐户”,那么会将应用程序服务器 JVM 归类为名为 SYSTEM 的特殊 Windows 用户的子组件。不允许此用户连接至 DB2,因此导致先前显示的异常。 | 您有两种选择:
|
在一个阶段事务回滚后,DB2 通用 JDBC 驱动程序类型 4 中的 XA 准备调用上发生 XAException: XAER_NOTA
症状
对于使用随 DB2 V8.2 提供的 DB2 通用 JDBC 驱动程序类型 4 XA 的应用程序,连接可能会失败并触发 XAER_NOTA XAException 错误。下列代码块是此异常的一个示例:
J2CA0027E: An exception occurred while invoking prepare on an
XA Resource Adapter from dataSource jdbc/SDOSVT, within
transaction ID {XidImpl: formatId(57415344), gtrid_length(36), bqual_length(54),
data(000000ff5191398200000001000000296cac5c42fe3c6838631cbaafc8b5a9253b846544
000000ff5191398200000001000000296cac5c42fe3c6838631cbaafc8b5a9253b8465440000000
10000000000000000000000000002)}:
javax.transaction.xa.XAException: XAER_NOTA
at com.ibm.db2.jcc.a.xb.a(xb.java:1682)
at com.ibm.db2.jcc.a.xb.a(xb.java:841)
at com.ibm.db2.jcc.a.xb.prepare(xb.java:812)
at com.ibm.ws.rsadapter.spi.WSRdbXaResourceImpl.prepare(WSRdbXaResourceImpl.java:837)
...
问题
如果在一阶段事务(例如将自动落实设置为 false 的局部事务)中使用 DB2 通用 JDBC 驱动程序类型 4 XA 连接,并且回滚了该一阶段事务,那么下一次在两阶段事务中使用该连接会在准备调用时失败。
DB2 通用 JDBC 驱动程序类型 4 XA 支持中存在的问题使得 XA 准备调用失败。如果落实了一阶段事务,那么此问题不会发生;如果是以类型 2 方式使用 DB2 通用 JDBC 驱动程序,也不会发生此问题。
解决方案
升级到 DB2 版本 8.2 修订包 1,它相当于版本 8.1 修订包 8。随这些发行版提供的通用 JDBC 驱动程序 XA 可以解决类型 4 方式的上述问题。
由于 JDBC 驱动程序文件版本不兼容导致对应用程序客户机记录 java.rmi.MarshalException
症状
对于包含应用程序客户机的应用程序,应用程序服务器的客户机日志文件中显示以下错误消息:
java.rmi.MarshalException: CORBA MARSHAL 0x4942f89a No; nested exception is:
org.omg.CORBA.MARSHAL: Unable to read value from underlying bridge : Mismatched serialization
UIDs : Source (Rep.
IDRMI:com.ibm.db2.jcc.c.SqlException:63EEE52211DCD763:82CE0C0DA2B0A000)
= 82CE0C0DA2B0A000 whereas Target (Rep. 标识 RMI:com.ibm.db2.jcc.c.SqlException:63EEE52211DCD763:91C6171BC645E41B)
= 91C6171BC645E41B vmcid: 0x4942f000 minor code: 2202 completed: No
问题
应用程序客户机上和应用程序服务器上的 db2jcc.jar 文件来自于相互不兼容或与用作数据存储的 DB2 版本不兼容的 DB2 版本。
解决方案
检查应用程序客户机上、应用程序服务器上和 DB2 服务器上的 db2jcc.jar 文件。在客户机和应用程序服务器上,安装与 DB2 服务器兼容的同一版本的文件。
数据库故障导致对使用 DB2 通用驱动程序类型 4 的应用程序触发有问题的 -99999 异常
症状
如果使用 DB2 通用驱动程序类型 4 来访问 DB2 Network Server,并且数据库失败,那么数据库服务器会发出一般 -99999 异常,作为对每个 JDBC getConnection 请求的响应。下面摘录的代码中记录了此异常,它可能会导致应用程序中出现意外的行为。
java.sql.SQLException: IO Exception opening socket to
server bs8.rchland.ibm.com on port 1527.
The DB2 Server may be down.DSRA0010E: SQL State = null,
Error Code = -99,999DSRA0010E: SQL State = null,
Error Code = -99,999
at com.ibm.db2.jcc.b.a.<init>(a.java:125)
at com.ibm.db2.jcc.b.b.a(b.java:1011)
at com.ibm.db2.jcc.c.l.<init>(l.java:197)
at com.ibm.db2.jcc.b.b.<init>(b.java:258)
at com.ibm.db2.jcc.DB2PooledConnection.
<init>(DB2PooledConnection.java:44)
at com.ibm.db2.jcc.DB2ConnectionPoolDataSource.getPooledConnectionX
(DB2ConnectionPoolDataSource.java:80)
at com.ibm.db2.jcc.DB2ConnectionPoolDataSource.getPooledConnection
(DB2ConnectionPoolDataSource.java:45)
at com.ibm.ws.rsadapter.DSConfigurationHelper$1.run
(DSConfigurationHelper.java:945)
问题
当以类型 4 方式运行时,某些版本的 DB2 通用驱动程序会因数据库失败触发一般异常,而不是 WebSphere Application Server 可映射至旧的连接异常的特定错误代码。对于与 DB2 8.1 修订包 6 或修订包 7 以及 DB2 8.2 相关的驱动程序版本,会发生此问题。
解决方案
升级到 DB2 版本 8.2 修订包 1,它相当于版本 8.1 修订包 8,提供了上述方案中的有效错误代码。WebSphere Application Server 如预期的那样将此错误代码映射至 StaleConnectionException。
使用 DB2 通用 JDBC 驱动程序时无法访问 Linux 上的 DB2
症状
java.security.AccessControlException: Access denied (java.lang.RuntimePermission accessClassInPackage.sun.io)
- 如果运行 64 位 Linux:
com.ibm.db2.jcc.b.SqlException: Failure in loading T2 native library db2jcct2
问题
在 Linux 上配置 DB2 以使用通用 JDBC 驱动程序的过程未完成。
解决方案
- 验证 Linux 平台的 Java™ SDK 1.4.2 设置要求是否已满足。
- 配置用于在具有 DB2 JDBC 支持的 Linux 上构建 Java 应用程序的开发环境。请参阅 DB2 的应用程序开发主题以获取更多信息。
- 如果在 Linux/IA64 平台上运行 DB2,并使用 DB2 版本 8.1 修订包 7A,请执行有关“DB2 通用数据库 Linux IA64 版版本 8 修订包 7a 报告缺少 libdb.so.3 库”技术说明中描述的附加步骤。此步骤只对于修订包 7A 是必需的。此步骤对于 DB2 V8.1 修订包 7 或更低版本的 DB2 来说不是必需的;此步骤对于 DB2 V8.1 修订包 8 或更高版本的 DB2 来说也不是必需的。
容器管理的持久性 bean 中任何 VARCHAR FOR BIT DATA 列上发生非法转换
如果容器管理的持久性 (CMP) 类型的企业 bean 在 DB2 表中定义有任何 VARCHAR FOR BIT DATA 列,那么当这些 bean 部署在 DB2 通用 JDBC 类型 4 驱动程序中以保留数据时,运行时将抛出非法转换 SQLException。仅当您使用 DB2 通用 JDBC 类型 4 驱动程序,且 deferPrepares 属性设置为 true 时,才发生此异常。当 deferPrepares 属性设置为 true 时,DB2 通用 JDBC 类型 4 驱动程序将使用标准 JDBC 数据映射。
当前,生成的部署代码不遵循标准 JDBC 规范映射。执行时间的故障是因为准备要执行的企业 bean 的工具中存在问题。
- 在数据源配置中,将 deferPrepares 属性设置为 false。
- 如果您的表具有任何 VARCHAR FOR BIT DATA 或 LONG VARCHAR FOR BIT DATA 列,那么不要使用 DB2 通用 JDBC 类型 4 驱动程序。请参阅 DB2 V8.1 自述文件,以了解更多详细信息。