我的OCI应用程序在执行SELECT * FROM mytable
时返回ORA-03106(“致命的双任务通信协议错误”),其中mytable
有四列:INTEGER
,{{1} },VARCHAR(1000)
和FLOAT
,以及两行。如果只有一行,则调用成功。如果表中有DATE
列(也正在选中),则调用也会成功。
各种论坛都表明BLOB
- 相关问题可能是原因 - 即,在检索数据时,客户端上的字符集转换失败,因为(可能)找不到字符集转换文件。请注意,我已经测试了设置NLS_LANG
,NLS_LANG
,NLS_CHARACTERSET
和其他环境变量的许多可能组合。设置某些这些会影响观察到的行为:有时,Oracle会抛出ORA_NLS10
;在其他时候,客户端应用程序在检索到第一行之前崩溃(崩溃发生在ORA-01034: ORACLE not available ORA-27101: shared memory realm does not exist
内)。值得注意的是,如果客户端应用程序在首次建立连接时执行以下查询:OCIStmtFetch2()
,则不会发生崩溃;相反,返回ALTER SESSION SET NLS_NUMERIC_CHARACTERS = '.,'
错误。
注意:ORA-03106: fatal two-task communication protocol error
列的存在可能导致了这种情况 - 但事实证明,建立可重现的案例非常困难,因此我按原样发布了我的问题。
我花了超过50个小时试图解决这个问题。非常感谢任何帮助。
新:重要的其他详细信息(请参阅下面的代码段):问题仅发生在PIECEWISE数据检索期间 - 我使用的两种方法中的哪一种无关紧要(动态回调函数,或者使用get / set piece info函数的循环方法)。单步调试器并查看我提供给OCI的存储器中存储FETCHED数据的缓冲区,第一行中的所有4个字段总是被正确检索;第二列的初始FETCH(这是使用循环方法时返回的有关VARCHAR列信息请求的调用)成功填充所有非动态字段,但不包括VARCHAR列(即INTEGER)列已正确填充);然后下一个FETCH成功填充VARCHAR字段, 也应成功填充其余(非动态)列(FLOAT和DATE字段);但是,FLOAT字段已正确填充,但DATE字段已损坏,此外,此FETCH调用应返回成功,但它返回ORA-03106。
以下代码段,删除了无关的错误检查和其他代码,显示了正在发生的事情:
DATE
注意:正如我的标题更改所反映的那样,使用OCI和Oracle 11g时不会出现此问题。使用代码COMPLETELY不变,但包括OCI 11g头文件并加载11g OCI dll,运行11g Oracle数据库服务器侦听器/实例,代码成功,没有此错误。只有10g发生错误。
如果能够在10g版本中明确且有信誉地将其标识为OCI / Oracle 错误,我将感到满意。 (我确信它是。)但是,我找不到任何确认这是OCI / Oracle错误。
答案 0 :(得分:0)
正在使用哪种确切版本的Oracle客户端和服务器?
至少有一个已知的Oracle错误可能匹配:
适用于:Oracle Server - Enterprise Edition - 版本:10.2.0.1 to 10.2.0.2 - 版本:10.2到10.2本文档中的信息适用于任何平台。 已于2010年1月21日检查相关性
症状OCI 基于应用程序间歇性地抛出ORA-03106:致命的两个任务 通信原型错误,并在应用程序日志中有错误条目。
重要提示:在alert.log和SQL中可能看不到错误 NET跟踪文件
原因这已被识别为错误4523125
解决方案将客户端和服务器升级到10.2.0.3
更一般地说,这似乎是Oracle支持的一个问题。