3

我们最近开发了一个应用程序,它将在 DB2 中运行一个查询并向相应的收件人发送一封邮件。它在我们的本地系统和 QA 区域运行良好。但是在生产中,很少有查询失败(即使很少见,比如一周一次)。它在下面抛出异常。

异常内部细节:

错误 [40003] [IBM][CLI 驱动程序] SQL30081N 检测到通信错误。正在使用的通信协议:“TCP/IP”。正在使用的通信 API:“SOCKETS”。检测到错误的位置:“111.111.111.111”。检测错误的通信功能:“recv”。协议特定错误代码:“10004”、“ ”、“ ”。SQLSTATE=08001

由于错误只发生在生产中,并不经常发生,我们不确定是代码问题还是设置问题。你有什么主意吗?

4

3 回答 3

3

我们最近与我们的 IBM 代表讨论了这个问题。在查看了他们的内部知识库后,他建议我们将“Interrupt=0”添加到我们的连接字符串中,这是基于向遇到相同问题的其他客户提供的建议。

在 v10.5 FP2 之前,中断的默认值是 1,并且仍然适用于大多数连接。他们将连接到 FP2 中的 z/OS(大型机)的默认值更改为 2。

我们正在使用 C#,可以在此处找到 IBM Data Server Driver for .Net 的连接字符串属性。我确信他们的其他语言的驱动程序也有类似的属性。

IBM 文档中的这个页面更详细地介绍了该设置。

自从我们最近添加该属性以来,我们还没有看到这个问题,但它总是断断续续的,所以我还不能自信地说这个问题已经解决。时间会告诉我们...

于 2016-08-30T12:15:51.820 回答
2

该特定错误 ( SQL30081N ) 只是一条通用消息,表明您的 DB2 客户端和服务器之间存在网络问题。在这种情况下,您想查看Protocol specific error code(s). 在这里,您似乎在 Windows 上,并且 IBM 文档中没有给出特定代码 (10004)。

所以,如果你用谷歌搜索“windows 网络错误代码”,你会发现这个页面,上面写着:

WSAEINTR

10004

中断的函数调用。

A blocking operation was interrupted by a call to WSACancelBlockingCall.

哪个链接到此页面,其中包含有关该特定功能的更多信息(强调我的):

根据 Windows Sockets 2 规范,修订版 2.2.0,已删除 WSACancelBlockingCall 函数。

该函数不是由 WS2_32.DLL 直接导出的,Windows Sockets 2 应用程序不应使用该函数。通过 WINSOCK.DLL 和 WSOCK32.DLL 仍支持调用此函数的 Windows Sockets 1.1 应用程序。

阻塞钩子通常用于在调用阻塞函数期间保持单线程 GUI 应用程序响应。应用程序应该使用单独的线程(与主 GUI 线程分开)来进行网络活动,而不是使用阻塞挂钩。

我猜您的应用程序在生产应用程序中的阻塞时间可能比您的其他环境更长,并且在此过程中某些东西会导致中断。

希望这会引导您走上正确的道路...

于 2016-04-04T03:25:15.037 回答
0

我花了几个小时来解决同样的问题并修复它。我使用 Windows exe(使用 C#.NET 开发)从 DB2 数据库运行 SELECT 查询,但有时会出现此错误。最后我意识到我的问题是超时错误。协议代码“10004”消息错误,如果查询执行时间长于默认超时值 30 秒,有时会发生。也许“Windows Socket Error Codes”页面上的中断调用是由于超时机制而发生的。我添加了一条线来设置一个可接受的超时值,并摆脱了这个恼人的错误。我希望它对其他人有所帮助。这是我的代码修复:

 ... 
 connDb.Open(); 
 DB2Command cmdDb = new DB2Command(QueryText,connDb); 
 cmdDb.CommandTimeout = 300; //I added this line. 
 using (DB2DataReader readerDb = cmdDb.ExecuteReader()) 
 {
 ...
于 2019-05-16T09:30:59.510 回答