カスタム C++ OCI ラッパーを使用して、CQN C++ コールバック ベースの登録を正常に登録できますが、何らかの形でサブスクリプションがすぐに削除されたように見えます。単純な DML ではコールバックがありません。register() が正常に機能したサブスクリプションを登録解除しようとすると、ORA-29970: Specified registration id does not exist が発生します。
このテストは、ローカルの 11.2.0.1.0 Oracle サーバーを実行している Win7 (64 ビット) ボックスで実行しており、同じマシンで実行される instantclient-11.2.0.2.0 に対してビルドされた C++ クライアント アプリに接続しています。 .
- OCI_ATTR_SUBSCR_TIMEOUTを明示的に 0 に設定しようとしましたが、役に立ちませんでした。
- job_queue_processesインスタンス パラメータをチェックして、0 でないことを確認しました (1000 です)。
- もちろん、接続しているユーザー/スキーマにはCHANGE NOTIFICATIONが付与されています
この問題に関するアイデアが不足しています。他に何を試したり確認したりできるかについての洞察をいただければ幸いです。
どうにかして CQN を有効にする必要があるのではないかと考え始めています。私の DBA スキルはほとんどありません。これは Windows にインストーラーを使用して 11gR1 をストック インストールしたもので、特別な構成やカスタマイズはまったく行われていません。
ありがとう、 --DD
更新 #1
同僚が同じテストを正常に実行し、サーバー提供の oci.dll を使用して実行しました。私はそれを試しました(インスタントクライアントを使用してビルドしましたが、実行時にPATHを強制しました:Path=D:\oracle\product\11.2.0\dbhome_1\BIN;$(Path)
VSプロパティページ>デバッグ>環境で)、実際にCQNテストが機能しました!クライアントとサーバーの間のわずかなバージョンの違い、またはInstantclient (ちなみにLightバリアント) と完全なクライアントとサーバーのインストールの使用が本当の原因であるかどうかはまだわかりません。
しかし、新しいInstantClient が CQN をサポートしていないというのは悪いニュースです...
アップデート #2
Win64 のバージョン 12.2.0.(1|2|3).0 で、instantclient Light (65 MB) またはNormal (150 MB)の 6 つの組み合わせすべてを試しましたが、どれも機能しませんでした。フル クライアントはまだテストしておらず、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;
}