使用 SQuirreL“Reply.fill()”连接到 IBM DB2。消息:数据不足。ERRORCODE=-4499,SQLSTATE=08001”

vel*_*tis 8 db2 jdbc squirrel-sql

我现在已经尝试使用 SQuirreL 连接到外部 DB2 数据库 2 天。我总是收到错误:

[jcc][t4][2030][11211][3.58.82] A communication error occurred during operations
on the connection's underlying socket, socket input stream, or socket output
stream. Error location: Reply.fill().  Message: Insufficient data.
ERRORCODE=-4499, SQLSTATE=08001
Run Code Online (Sandbox Code Playgroud)

我正在使用 IBM DB2 通用 JDBC 驱动程序 v9.7 FP5。我也尝试过 v9.5。

一件事是 DB2 通过 Putty 建立隧道。服务器运行Linux和IBM DB2 v7.1。我用的是Win7x64。

我在网上浏览了许多涵盖此错误的论坛主题,但没有一个真正对我有用。(即iReport 到 DB2 连接 ERRORCODE=-4499,SQLSTATE=08001

首先,我认为这可能与未正确建立隧道的端口有关。但我从 Putty 会话配置中删除了端口,并发生了不同的错误。

问题的堆栈跟踪:

com.ibm.db2.jcc.am.io: [jcc][t4][2030][11211][3.58.82] A communication error
occurred during operations on the connection's underlying socket, socket input
stream, or socket output stream.  Error location: Reply.fill().  Message:
Insufficient data. ERRORCODE=-4499, SQLSTATE=08001
    at com.ibm.db2.jcc.am.ed.a(ed.java:319)
    at com.ibm.db2.jcc.t4.a.a(a.java:416)
    at com.ibm.db2.jcc.t4.a.a(a.java:411)
    at com.ibm.db2.jcc.t4.cb.b(cb.java:227)
    at com.ibm.db2.jcc.t4.cb.c(cb.java:249)
    at com.ibm.db2.jcc.t4.cb.c(cb.java:360)
    at com.ibm.db2.jcc.t4.cb.v(cb.java:1145)
    at com.ibm.db2.jcc.t4.db.a(db.java:42)
    at com.ibm.db2.jcc.t4.b.m(b.java:1238)
    at com.ibm.db2.jcc.t4.b.b(b.java:1112)
    at com.ibm.db2.jcc.t4.b.c(b.java:700)
    at com.ibm.db2.jcc.t4.b.b(b.java:686)
    at com.ibm.db2.jcc.t4.b.a(b.java:367)
    at com.ibm.db2.jcc.t4.b.<init>(b.java:307)
    at com.ibm.db2.jcc.DB2SimpleDataSource.getConnection(DB2SimpleDataSource.java:214)
    at com.ibm.db2.jcc.DB2Driver.connect(DB2Driver.java:456)
Run Code Online (Sandbox Code Playgroud)

我最好的猜测过去是,现在仍然是 JDBC 通用驱动程序不向后兼容 DB2 v7.1。

它可以在另一台装有 32 位 XP 的开发机器(同事)上运行。我尝试让它在不同的 32 位 XP 上运行,但出现相同的结果。

有人能至少描述一下这种异常现象的根源吗?

编辑

http://www.ibm.com/developerworks/forums/thread.jspa?messageID=14779629 这不可能是防火墙或隧道错误。已成功使用 telnet 打开通往正确端口的隧道。

Ian*_*vde 3

您需要找到并使用 DB2 7.2 或 DB2 7.1 客户端代码(也称为 DB2 Client Application Enabler)。在 DB2 8.1 之前,IBM 使用一种不同的、依赖于平台的协议(称为 DB2RA)来进行客户端和服务器之间的通信。DB2 8.1 切换到标准 DRDA 协议。在特定配置中,DB2 8.x 客户端可以与 DB2 7.x 服务器通信。

或者,如果您使用的是 Java 应用程序,则可以尝试查找/使用 Type 3 JDBC 驱动程序 (COM.ibm.db2.jdbc.net.DB2Driver)。该驱动程序是无客户端的(它具有 3 层架构,因为它需要在数据库服务器上运行所谓的“JDBC Applet 服务器”。您可以通过查找名为 的进程来查看它是否在您的 Linux 机器上运行db2jd。一般来说,此进程将显示为,例如,db2jd 6789其中 6789 是 applet 服务器正在侦听的端口号。如果您没有看到此进程,您可以通过执行命令来启动它(作为 DB2 实例所有者)db2jstrt

  • 一条评论:Type 3 驱动程序在 DB2 8.1 中已被弃用。因此,只有在必要时才应将其用作创可贴。 (2认同)