【问题标题】:DB2 - CLI0108E Communication link failure. SQLSTATE=40003DB2 - CLI0108E 通信链路故障。 SQLSTATE=40003
【发布时间】:2012-12-20 16:06:22
【问题描述】:

当我尝试对 IBM DB2 9.1 版本重新执行查询时,我不断收到以下错误消息。

CLI0108E 通信链路故障。 SQLSTATE=40003

查询正在更新大量记录(超过 50000 条记录)。

  • 我确实尝试将超时更改为“0”以执行查询

    但这并没有帮助。

另外,我的 db2cli.ini 文件没有任何超时详细信息。我应该在那里添加什么吗??

请指教。

【问题讨论】:

  • 抱歉,我原来的答案不完整。我做了更多的挖掘工作,我刚刚更新了我的答案,希望对你更有用。

标签: error-handling db2 connection-timeout


【解决方案1】:

CLI0108E 仅表示连接已断开。来自official IBM documentation of this error code

CLI0108E通信链路故障。

说明执行此函数时驱动程序与数据源的连接失败。

用户响应建立新连接。


SQLState (40003) 表示数据库服务器无法判断语句是否成功完成。 (SQLState 消息及其含义的文档可以在这里找到:http://publib.boulder.ibm.com/infocenter/db2luw/v9/index.jsp?topic=%2Fcom.ibm.db2.udb.msg.doc%2Fdoc%2Fr0sttmsg.htm

此范围内的值:

  • 40001 发生自动回滚的死锁或超时。
  • 40003 语句完成未知。
  • 40504 系统错误导致工作单元回滚。
  • 40506 由于 SQL 错误,当前事务已回滚。
  • 40507 由于创建索引失败,当前事务已回滚。

CLI0108E 可能有多种原因:网络问题、客户端或服务器由于超时而关闭连接、有人在计算机房踢电缆,等等。我什至在我们的环境中看到,在特定 VM 主机上运行的虚拟服务器出现此错误,因为虚拟 NIC 卡存在问题,并且通过重新安装驱动程序修复了该问题。可能的原因列表非常大,但一个好的网络管理员应该能够提供帮助。 (使用嗅探器监控数据包是在其他方法都失败时追踪来源的好方法。)

如果可以的话,重构代码以上传更小的集合可能不会有什么坏处。假设您有 10,000 条记录,尝试一次上传 1000 条记录,十次看看是否有帮助。

我(曾经)在服务器完全不可靠的情况下使用的另一种方法是尝试一次插入一条记录。

伪代码:(假设一个名为“connection”的连接对象和一个名为“cmd”的命令对象使用该连接......)

connection.Open()

for each record
   try
      cmd.CommandText  ="whatever changes need to be made"
      cmd.Execute()
   catch(Exception ex)
      if( the exception is a communication link failure)
         connection.Open()
         cmd.Execute()
       else
          handle different errors accordingly
       end if
  end try

next

但是这种方法存在性能问题,很混乱,并且仍然可能会因为尝试重新打开连接失败而失败。即使我在紧要关头使用它,我也不建议长期使用它。 (一旦原始问题得到解决,我就放弃了这种方法。)您最好尝试追踪断开连接的根本原因。

在您的情况下,可能是因为您试图一次上传太多数据。我对此表示怀疑,但它可能。如果我站在你的立场上,我肯定会首选重构代码以以更小的块发送数据。

【讨论】:

  • 非常感谢您的意见。我尝试减少上传的记录块,并从另一台用户机器上进行测试。我没有尝试重新打开连接。但是,如果连接丢失,我应该会收到一条错误消息,说明与服务器的连接丢失或这些线路上的某些内容!?
  • 我已经更改了 commandtimeout = 0 您是否建议也更改连接超时 = 0?
  • 最终将所有 DB2 内容写入 sql 表并关闭 DB2 连接。它有助于解决连接超时问题。同样在我的情况下,分解 DB2 查询会导致超时。所以一次性执行查询,然后写入sql表。
  • @DavidStratton - 您能否将您的答案复制到 DBA SE?那里问了一个非常相似的问题。 dba.stackexchange.com/questions/47652/…
【解决方案2】:

感谢大卫为我指明了正确的方向。就我而言,这是内存泄漏。我有如下代码

IDbConnection conn = db2Access.GetConnection()
IDbCommand cmd = conn.CreateCommand()

我改成

using(IDbConnection conn = db2Access.GetConnection())
{
  using(IDbCommand cmd = conn.CreateCommand())
  {
   ......

  }
}

【讨论】:

    猜你喜欢
    • 2012-05-27
    • 2013-05-03
    • 2018-02-17
    • 2012-10-14
    • 2011-08-12
    • 1970-01-01
    • 2012-02-21
    • 2014-12-31
    • 2011-02-28
    相关资源
    最近更新 更多