Database DB2通信错误

Database DB2通信错误,database,database-design,db2,database-connection,db2-connect,Database,Database Design,Db2,Database Connection,Db2 Connect,我们最近开发了一个应用程序,它将在DB2中运行查询并向相应的收件人发送邮件。它在我们的本地系统和QA区域运行良好。但在生产中,很少有查询失败,即使很少,比如每周一次。它抛出下面的异常 例外情况详细信息: 错误[40003][IBM][CLI驱动程序]SQL30081N发生通信错误 被发现了。正在使用的通信协议:TCP/IP。 正在使用的通信API:套接字。错误发生的位置 检测到:111.111.111.111。通信功能检测 错误:recv。协议特定错误代码:10004。 SQLSTATE=080

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

例外情况详细信息:

错误[40003][IBM][CLI驱动程序]SQL30081N发生通信错误 被发现了。正在使用的通信协议:TCP/IP。 正在使用的通信API:套接字。错误发生的位置 检测到:111.111.111.111。通信功能检测 错误:recv。协议特定错误代码:10004。 SQLSTATE=08001

由于错误只发生在生产环境中,并不经常发生,所以我们不确定这是代码问题还是设置问题。您知道吗?

这个特定的错误只是一条一般性的消息,表示DB2客户机和服务器之间存在网络问题。在本例中,您需要查看特定于协议的错误代码。这里,看起来您是在Windows上,IBM文档中没有给出特定的代码10004

所以,如果你搜索windows网络错误代码,你会发现,上面写着:

WSAEINTR

10004

中断的函数调用

A blocking operation was interrupted by a call to WSACancelBlockingCall.
以下链接提供了有关该特定功能的更多信息:

WSACancelBlockingCall函数已根据法规删除 使用Windows Sockets 2规范,版本2.2.0

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

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

我猜您的应用程序在生产应用程序中的阻塞时间可能比在其他环境中的阻塞时间要长,并且在这一过程中有一些原因导致了中断


希望这能引导您走上正确的道路……

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

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

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

从IBM文档中,我们可以了解有关设置的更多细节


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

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

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

你有没有下过决心?在访问大型机数据时,我们会间歇性地遇到这个问题,通常我们只会以重试逻辑结束。有类似的问题,中断=0修复了它。多谢。