DB2 - CLI0108E 通信链路故障。SQLSTATE=40003

JJu*_*ior 3 db2 error-handling connection-timeout

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

CLI0108E 通信链路故障。SQLSTATE=40003

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

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

    但这并没有帮助。

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

请指教。

Dav*_*vid 6

CLI0108E仅表示连接已断开。来自此错误代码官方 IBM 文档

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 主机上的虚拟服务器出现此错误,因为虚拟网卡存在问题,并通过重新安装驱动程序修复。可能的原因列表非常多,但优秀的网络管理员应该能够提供帮助。(当所有其他方法都失败时,使用嗅探器监视数据包是追踪来源的好方法。)

如果可以,重构代码以上传较小的集合可能不会有什么坏处。假设您有 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
Run Code Online (Sandbox Code Playgroud)

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

你的情况,这可能的,潜在的原因可能仅仅是因为你想一次上传过多的数据。我对此表示怀疑,但这是可能的。重构代码以更小的块发送数据肯定是我的第一选择。