3

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

CLI0108E 通信链路故障。SQLSTATE=40003

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

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

    但这并没有帮助。

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

请指教。

4

2 回答 2

6

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

CLI0108E通信链路故障。

Explanation在执行此函数期间,驱动程序和数据源之间的连接失败。

用户响应建立新连接。


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

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

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

于 2012-12-20T17:00:52.493 回答
0

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

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

我改为

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

  }
}
于 2020-09-09T17:56:04.293 回答