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