【问题标题】:DB2 Communication ErrorDB2 通信错误
【发布时间】:2016-07-21 05:20:47
【问题描述】:

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

异常内部细节:

ERROR [40003] [IBM][CLI Driver] SQL30081N 出现通信错误 被检测到。正在使用的通信协议:“TCP/IP”。 正在使用的通信 API:“SOCKETS”。错误发生的位置 检测到:“111.111.111.111”。通讯功能检测 错误:“接收”。协议特定错误代码:“10004”、“”、“”。 SQLSTATE=08001

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

【问题讨论】:

  • 你有没有解决这个问题?我们在访问大型机数据时会间歇性地遇到这个问题,通常我们只是以重试逻辑结束。

标签: database database-design db2 database-connection db2-connect


【解决方案1】:

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

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

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

IBM 文档中的This page 详细介绍了该设置。

自从我们最近添加该属性以来,我们还没有发现此问题,但它总是断断续续,因此我还不能自信地说问题已得到解决。时间会证明...

【讨论】:

  • 遇到了类似的问题,Interrupt=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直接导出的 Sockets 2 应用程序不应使用此函数。 Windows 套接字 调用该函数的1.1应用程序仍然通过WINSOCK.DLL和WSOCK32.DLL支持。

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

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

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

【讨论】:

    【解决方案3】:

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

     ... 
     connDb.Open(); 
     DB2Command cmdDb = new DB2Command(QueryText,connDb); 
     cmdDb.CommandTimeout = 300; //I added this line. 
     using (DB2DataReader readerDb = cmdDb.ExecuteReader()) 
     {
     ...
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-17
      • 2014-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多