当我尝试对 IBM DB2 9.1 版本重新执行查询时,我不断收到以下错误消息。
CLI0108E 通信链路故障。SQLSTATE=40003
该查询正在更新大量记录(超过 50000 条记录)。
我确实尝试将超时更改为“0”以执行查询
但这并没有帮助。
此外,我的 db2cli.ini 文件没有任何超时详细信息。我应该在那里添加任何东西吗?
请指教。
当我尝试对 IBM DB2 9.1 版本重新执行查询时,我不断收到以下错误消息。
CLI0108E 通信链路故障。SQLSTATE=40003
该查询正在更新大量记录(超过 50000 条记录)。
我确实尝试将超时更改为“0”以执行查询
但这并没有帮助。
此外,我的 db2cli.ini 文件没有任何超时详细信息。我应该在那里添加任何东西吗?
请指教。
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
但是这种方法存在性能问题,很混乱,并且仍然可能会因为尝试重新打开连接失败而失败。即使我在紧要关头使用它,我也不建议长期使用它。(一旦原始问题得到解决,我就摆脱了这种方法。)你最好尝试追踪断开连接的根本原因。
在您的情况下,根本原因可能只是您尝试一次上传太多数据。我对此表示怀疑,但这是可能的。如果我站在你的立场上,那么我的首选肯定是重构代码以以更小的块发送数据。
感谢大卫,为我指明了正确的方向。就我而言,这是内存泄漏。我有如下代码
IDbConnection conn = db2Access.GetConnection()
IDbCommand cmd = conn.CreateCommand()
我改为
using(IDbConnection conn = db2Access.GetConnection())
{
using(IDbCommand cmd = conn.CreateCommand())
{
......
}
}