Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Cách nhận thông báo cơ sở dữ liệu đến ứng dụng C ++

Một cách tiếp cận là sử dụng Xếp hàng nâng cao của Oracle . Vì mục đích đó, bạn cần thiết lập một hàng đợi (và một bảng hàng đợi) và viết một thủ tục PL / SQL chờ thông báo tiếp theo trong hàng đợi.

Sau đó, phía C ++ gọi thủ tục PL / SQL, thủ tục này sẽ trả về khi sự kiện tiếp theo xảy ra.

Về phía Oracle, bạn sẽ cần sử dụng DBMS_SCHEDULER hoặc một cơ sở tương tự để tạo sự kiện , tức là chèn một thông báo mới vào hàng đợi vào thời điểm thích hợp.

Nó vẫn là một cách tiếp cận thăm dò ý kiến. Tuy nhiên, hoàn toàn không có hoạt động nào giữa hai sự kiện.

Cập nhật:

Đây là một số mã mẫu.

Thiết lập ban đầu của hàng đợi (thông báo chứa một số và một giá trị văn bản):

grant AQ_ADMINISTRATOR_ROLE to appuser;
grant EXECUTE ON DBMS_AQ to appuser;
grant EXECUTE ON DBMS_AQ to appuser;


CREATE TYPE sample_payload_type AS OBJECT
(
  cmd  VARCHAR2(20),
  id   NUMBER
);


BEGIN
  DBMS_AQADM.CREATE_QUEUE_TABLE (
    queue_table        => 'sample_queue_table',
    queue_payload_type => 'sample_payload_type',
    sort_list          => 'ENQ_TIME',
    compatible         => '10.0'
  );
END;
/

BEGIN
  DBMS_AQADM.CREATE_QUEUE (
    queue_name         => 'sample_queue',
    queue_table        => 'sample_queue_table'
  );

  DBMS_AQADM.START_QUEUE (
    queue_name         => 'sample_queue'
  );
END;
/

Tiêu đề gói:

create or replace package sample_queue_pkg
as

  procedure get_next_msg(
    i_max_wait      number
   ,o_cmd      out  varchar2
   ,o_id       out  number
  );


  procedure put_msg(
    i_cmd           varchar2
   ,i_id            number
  );

end sample_queue_pkg;
/

Thân gói:

create or replace package body sample_queue_pkg
as

  procedure get_next_msg(
    i_max_wait      number
   ,o_cmd      out  varchar2
   ,o_id       out  number
  )
  is
    dequeue_options dbms_aq.dequeue_options_t;
    message_properties dbms_aq.message_properties_t;
    message_handle RAW(16);
    message sample_payload_type;

    NO_MESSAGE_RECEIVED EXCEPTION;
    PRAGMA EXCEPTION_INIT(NO_MESSAGE_RECEIVED, -25228);

  begin
    dequeue_options.wait := i_max_wait;
    DBMS_AQ.DEQUEUE (
      queue_name => 'appuser.sample_queue',
      dequeue_options => dequeue_options,
      message_properties => message_properties,
      payload => message,
      msgid => message_handle
    );

    o_cmd := message.cmd;
    o_id := message.id;

  exception
    when NO_MESSAGE_RECEIVED then
      o_cmd := null;
      o_id := null;

  end get_next_msg;


  procedure put_msg(
    i_cmd           varchar2
   ,i_id            number
  )
  is
    enqueue_options dbms_aq.enqueue_options_t;
    message_properties dbms_aq.message_properties_t;
    message_handle RAW(16);
    message sample_payload_type;
    message_id NUMBER;

  begin
    message := sample_payload_type(i_cmd, i_id);
    DBMS_AQ.ENQUEUE(
      queue_name => 'appuser.sample_queue',
      enqueue_options => enqueue_options,
      message_properties => message_properties,
    payload => message,
      msgid => message_handle
    );
  end put_msg;

end sample_queue_pkg;
/

Máy chủ cơ sở dữ liệu có thể gửi tin nhắn bằng mã sau:

sample_queue_pkg.put_msg('run_task', 8234);
commit;

Máy chủ C ++ có thể đợi tin nhắn (và nhận chúng) gọi đến sample_queue_pkg.get_next_msg được lưu trữ . Tham số i_max_wait chỉ định thời gian tối đa để đợi tin nhắn tiếp theo tính bằng giây. Bạn có thể muốn triển khai một vòng lặp chờ thông báo tiếp theo và xử lý nó cho đến khi nó nhận được tín hiệu rằng máy chủ sắp thoát.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kết nối Oracle với SQL Server thông qua liên kết cơ sở dữ liệu

  2. Làm thế nào để kiểm tra xem một thủ tục được lưu trữ có tồn tại hay không?

  3. Cách đặt thủ công Chuỗi kết nối Oracle trong DbContext

  4. Oracle 12.2 Sharding

  5. Chọn Thu thập hàng loạt vào Ví dụ Oracle