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

时间:2012-12-20 16:06:22

标签: error-handling db2 connection-timeout

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

CLI0108E通信链路故障。 SQLSTATE = 40003

查询正在更新一组记录(超过50000条记录)。

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

    但这没有帮助。

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

请告知。

2 个答案:

答案 0 :(得分:4)

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条记录,请尝试一次上传一千条记录,十次以查看是否有帮助。

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

伪代码 :(假设名为“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

但是这种方法存在性能问题,很麻烦,但仍然可能无法重新尝试连接失败。虽然我已经用了它,但我不建议长期使用它。 (一旦原始问题得到修复,我就摆脱了这种方法。)你最好不要试图找出断开连接的根本原因。

在您的情况下, 可能导致潜在原因可能是您尝试一次上传过多数据。我对此表示怀疑,但 可能 。重构代码以便以较小的块发送数据肯定是我的第一选择是我在你的鞋子里。

答案 1 :(得分:0)

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

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

我更改为

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

  }
}