问题描述
嗨,汤姆!
我可以创建一个非阻塞的OCI连接,并获得oci_still_exercing状态与ORA-03123 (操作将阻止) 错误,
但是,什么是确定哪个操作将阻止读取或写入的方法。我想处理许多Oracle连接 (与光纤多路复用),并且需要从这些连接轮询fd。我不能做繁忙的循环,因为还有其他工作要做。
谢谢!
我可以创建一个非阻塞的OCI连接,并获得oci_still_exercing状态与ORA-03123 (操作将阻止) 错误,
但是,什么是确定哪个操作将阻止读取或写入的方法。我想处理许多Oracle连接 (与光纤多路复用),并且需要从这些连接轮询fd。我不能做繁忙的循环,因为还有其他工作要做。
谢谢!
专家解答
“操作将阻止” 一词可能有点误导。如错误文本所示,这仅意味着有问题的语句现在无法完成:
“原因: 这是一个状态代码,指示该操作现在无法完成。
Action: 无; 这不是一个错误。该操作应再次重试以完成。”
http://docs.oracle.com/database/122/ERRMG/ORA-02140.htm#GUID-008ABD32-275E-467A-AE6B-04976F2A8462__GUID-66A2A4B8-66F2-4A13-B73D-74FFE4728C58
发生这种情况的原因有很多。例如,您可能正在尝试插入到以独占模式锁定的表:
https://community.oracle.com/message/373286
正如OCI程序员指南中讨论的那样,您需要在代码中对此进行测试:
OCI提供了在阻塞模式或非阻塞模式下建立服务器连接的能力。在阻塞模式下建立连接时,OCI调用仅在调用完成时 (成功或出错) 返回对OCI客户端应用程序的控制。对于非阻塞模式,如果调用无法完成,则立即将控件返回给OCI程序,并且调用返回oci_still_exercing的值。
在非阻塞模式下,应用程序必须测试每个OCI函数的返回代码,以查看它是否返回oci_still_exercing。如果是这样,则OCI客户端可以继续处理程序逻辑,同时等待重试对服务器的OCI调用。此模式在图形用户界面 (GUI) 应用程序,实时应用程序以及分布式环境中特别有用。”
http://docs.oracle.com/database/122/LNOCI/oci-programming-basics.htm#LNOCI16240
“原因: 这是一个状态代码,指示该操作现在无法完成。
Action: 无; 这不是一个错误。该操作应再次重试以完成。”
http://docs.oracle.com/database/122/ERRMG/ORA-02140.htm#GUID-008ABD32-275E-467A-AE6B-04976F2A8462__GUID-66A2A4B8-66F2-4A13-B73D-74FFE4728C58
发生这种情况的原因有很多。例如,您可能正在尝试插入到以独占模式锁定的表:
https://community.oracle.com/message/373286
正如OCI程序员指南中讨论的那样,您需要在代码中对此进行测试:
OCI提供了在阻塞模式或非阻塞模式下建立服务器连接的能力。在阻塞模式下建立连接时,OCI调用仅在调用完成时 (成功或出错) 返回对OCI客户端应用程序的控制。对于非阻塞模式,如果调用无法完成,则立即将控件返回给OCI程序,并且调用返回oci_still_exercing的值。
在非阻塞模式下,应用程序必须测试每个OCI函数的返回代码,以查看它是否返回oci_still_exercing。如果是这样,则OCI客户端可以继续处理程序逻辑,同时等待重试对服务器的OCI调用。此模式在图形用户界面 (GUI) 应用程序,实时应用程序以及分布式环境中特别有用。”
http://docs.oracle.com/database/122/LNOCI/oci-programming-basics.htm#LNOCI16240
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




