1

使用自定义 C++ OCI 包装器,我可以成功注册一个基于 CQN C++ 回调的注册,但似乎订阅以某种方式立即被丢弃,在我背后。我没有收到关于简单 DML 的回电。如果我尝试取消注册该订阅,而 register() 工作得很好,我会得到ORA-29970: Specified registration id does not exist

我在 Win7(64 位)机器上运行此测试,运行本地 11.2.0.1.0 Oracle 服务器,并连接了针对在同一台机器上运行的 Instantclient-11.2.0.2.0 构建的 C++ 客户端应用程序.

  • 我尝试将OCI_ATTR_SUBSCR_TIMEOUT显式设置为 0,但无济于事。
  • 我检查了job_queue_processes实例参数以确保它不是 0(它是 1000)。
  • 当然,我正在连接的用户/模式已被授予更改通知

我在这个问题上的想法已经用完了,我希望能对我可以尝试或检查的其他内容提供一些见解。

我开始怀疑是否需要以某种方式激活CQN 。我的 DBA 技能几乎不存在,这是使用安装程序在 Windows 上进行的 11gR1 库存安装,根本没有进行任何特殊配置或定制。

谢谢,--DD

更新#1

一位同事成功地运行了同样的测试,他使用服务器提供的 oci.dll 运行它。我试过了(我使用instantclient构建,但在运行时强制使用PATH:Path=D:\oracle\product\11.2.0\dbhome_1\BIN;$(Path)在VS属性页>调试>环境中),确实CQN测试有效!我们仍然没有弄清楚客户端和服务器之间的细微版本差异,或者使用 Instantclient(顺便说一下Light变体)与完整客户端与服务器安装是否是真正的罪魁祸首。

一个较新的即时客户端不支持 CQN 是个坏消息……

更新#2

我已经在 Win64 上的 12.2.0.(1|2|3).0 版本中尝试了所有 6 种 Instantclient Light (65 MB) 或Normal (150 MB) 组合,但都没有奏效。尚未测试完整客户端,也尚未在 Linux 上进行测试。

Environment_var cqn_env = Environment::create(OCI_EVENTS + OCI_OBJECT);
Connection_var cqn_conn = Connection::logon2(...);
Subscription sub(cqn_conn, "cqn_test", OCI_SUBSCR_NAMESPACE_DBCHANGE);
sub.set<attr::SUBSCR_CALLBACK>( &cqn_callback_func );
sub.set<attr::SUBSCR_CQ_QOSFLAGS>( OCI_SUBSCR_CQ_QOS_QUERY );

try {
    sub.register_self();
} catch (const OracleException& ex) {
    BOOST_REQUIRE(ex.error_code && *ex.error_code == 29972);
    cerr << "\nSKIPPED: test requires CHANGE NOTIFICATION privilege" << endl;
    return;
}
4

0 回答 0