我们最近开发了一个应用程序,它将在DB2中运行查询并将邮件发送给相应的收件人。它适用于我们的本地系统和QA区域。但在生产中,很少有查询失败(即使它很少见,比如一周一次)。它引发了下面的例外。
Exception InnerDetails:
错误[40003] [IBM] [CLI驱动程序] SQL30081N通信错误有 被发现了。使用的通信协议:“TCP / IP”。 正在使用的通信API:“SOCKETS”。错误的位置 检测到:“111.111.111.111”。通讯功能检测 错误:“recv”。协议特定的错误代码:“10004”,“”,“”。 SQLSTATE = 08001
由于错误仅在生产中发生而不是经常发生,因此我们不确定它是代码还是设置问题。你有什么想法吗?
答案 0 :(得分:2)
该特定错误(SQL30081N)只是一条通用消息,表明DB2客户端与服务器之间存在网络问题。在这种情况下,您要查看Protocol specific error code(s)
。在这里,它看起来像是在Windows上,并且IBM文档中没有给出特定的代码(10004)。
所以,如果你谷歌“windows网络错误代码”,你会发现this page,其中说:
WSAEINTR
10004
中断函数调用。
A blocking operation was interrupted by a call to WSACancelBlockingCall.
哪些链接指向this page,并提供有关该特定功能的更多信息(强调我的):
WSACancelBlockingCall功能已被删除 使用Windows Sockets 2规范,修订版2.2.0。
WS2_32.DLL和Windows不直接导出该函数 套接字2应用程序不应使用此功能。 Windows套接字 1.1仍然通过WINSOCK.DLL和WSOCK32.DLL支持调用此函数的应用程序。
阻塞挂钩通常用于保持单线程GUI 应用程序在调用阻塞函数时响应。而不是 使用阻塞钩子,应用程序应该使用单独的线程 (与主GUI线程分开)用于网络活动。
我猜你的应用程序可能在生产应用程序中阻塞的时间比其他环境要长,而且一路走来都会导致中断。
希望这会让你走上正确的道路......
答案 1 :(得分:2)
我们最近与IBM代表讨论了这个问题。在查看了他们的内部知识库之后,他建议我们根据给出具有相同问题的其他客户的建议,在我们的连接字符串中添加“Interrupt = 0”。
在v10.5 FP2之前,Interrupt的默认值为1,仍然适用于大多数连接。对于FP2中与z / OS(大型机)的连接,他们将默认值更改为2。
我们正在使用C#,可以找到.Net的IBM数据服务器驱动程序的连接字符串属性here。我确信其他语言的驱动程序也有类似的属性。
来自IBM文档的This page会详细介绍该设置。
自从我们最近添加了该属性以来,我们还没有看到这个问题,但它总是间歇性的,所以我还不能自信地说问题是固定的。时间会告诉......
答案 2 :(得分:0)
我花了几个小时来解决相同的问题并加以解决。我使用Windows exe(使用C#.NET开发)从DB2数据库运行SELECT查询,有时会出现此错误。最后,我意识到我的问题是超时错误。如果查询执行时间超过30秒(默认超时值),则有时会出现协议代码“ 10004”消息错误。可能是出于超时机制而发生了“ Windows套接字错误代码” page上的中断调用。我添加一行来设置可接受的超时值,并摆脱了这个令人讨厌的错误。希望对您有所帮助。 这是我的代码修复程序:
...
connDb.Open();
DB2Command cmdDb = new DB2Command(QueryText,connDb);
cmdDb.CommandTimeout = 300; //I added this line.
using (DB2DataReader readerDb = cmdDb.ExecuteReader())
{
...