2013-04-18 42 views
6

Tôi có thể đặt móc thay đổi hoặc thêm một số hàng trong bảng và được thông báo một cách nào đó khi sự kiện đó được nâng cấp không? Tôi phát hiện ra web và chỉ bị mắc kẹt với đường ống. Nhưng không có cách nào để nhận được thông báo ngay khi nó được gửi đi. Chỉ cố gắng định kỳ để nhận.Mẫu quan sát viên trong Oracle

+1

Móc như vậy thường được gọi là 'trình kích hoạt' –

+0

Ai (người dùng, ứng dụng, ...) bạn đang cố gắng thông báo? –

+0

@ChrisSaxon Một ứng dụng, được kết nối với DB – kseen

Trả lời

2

Nhìn vào DBMS_ALERT, DBMS_PIPE hoặc (tốt nhất) AQ (Advanced xếp hàng) đó là hệ thống tin nhắn nội bộ của Oracle. AQ của Oracle có API riêng của mình, nhưng cũng có thể được xử lý như nhà cung cấp Java JMS.

Ngoài ra còn có các kỹ thuật như Luồng hoặc (XStream) nhưng những kỹ thuật này khá phức tạp.

3

Trong cơ sở dữ liệu, trình kích hoạt chính là những gì bạn cần. Bạn có thể chạy PL/SQL tùy ý khi dữ liệu được chèn vào, xóa, cập nhật hoặc bất kỳ kết hợp nào của chúng.

Nếu bạn cần phải có sự kiện tuyên truyền bên ngoài cơ sở dữ liệu, bạn sẽ cần một cách để gọi ra ứng dụng bên ngoài của bạn từ kích hoạt PL/SQL của bạn. Một số tùy chọn có thể là:

  1. DBMS_PIPES - Ống trong Oracle tương tự như ống Unix. Một phiên có thể viết và một phiên riêng biệt có thể đọc để chuyển thông tin. Ngoài ra, họ không giao dịch để bạn nhận được tin nhắn ngay lập tức. Một nhược điểm là API là bình chọn dựa trên vì vậy tôi đề nghị lựa chọn # 2.
  2. Java - PL/SQL có thể gọi Java tùy ý (giả sử bạn tải lớp của bạn vào cơ sở dữ liệu của bạn). Điều này mở ra cánh cửa để thực hiện bất kỳ loại tin nhắn nào bạn muốn bao gồm việc sử dụng JMS để đẩy tin nhắn vào một hàng đợi tin nhắn. Tùy thuộc vào cách bạn thực hiện điều này, bạn thậm chí có thể có nó được giao dịch gắn với chính câu lệnh INSERT/UPDATE/DELETE. Ứng dụng nghe sau đó sẽ chỉ lắng nghe hàng đợi JMS và nó sẽ không bị ràng buộc với DB xuất bản sự kiện ở tất cả.
4

Ngoài các câu trả lời khác, bạn có thể xem database change notification. Nếu ứng dụng của bạn là dựa trên Java, có tài liệu cụ thể bao gồm và tương tự cho .NET herehere; và có một bài viết khác here.

Bạn cũng có thể xem continuous query notification, có thể được sử dụng từ OCI.

Tôi biết câu trả lời chỉ có liên kết không tốt nhưng tôi không có kinh nghiệm viết bất cứ thứ gì (tôi phải thú nhận là tôi chưa sử dụng, nhưng tôi có ý nghĩa để xem xét DCN cho trong khi bây giờ ...) và điều này quá dài để nhận xét * 8-)

7

Thường cần tránh sử dụng mẫu quan sát từ cơ sở dữ liệu.

Tại sao? Nó dựa trên công nghệ độc quyền của nhà cung cấp (không chuẩn), thúc đẩy việc khóa nhà cung cấp cơ sở dữ liệu và rủi ro hỗ trợ, và gây ra một chút sưng lên. Từ quan điểm của doanh nghiệp, nếu không được thực hiện theo cách được kiểm soát, nó có thể trông giống như "skunkworks" - triển khai theo cách khác thường thường được ứng dụng và các mẫu và công cụ tích hợp. Nếu được thực hiện ở cấp độ hạt mịn, nó có thể dẫn đến việc kết nối chặt chẽ với những thay đổi dữ liệu nhỏ với một lượng lớn thông tin và xử lý không dự đoán, ảnh hưởng đến hiệu suất. Một cog phụ trong máy có thể là một điểm phá vỡ thêm - nó có thể nhạy cảm với cấu hình O/S, mạng và bảo mật hoặc có thể có lỗ hổng bảo mật trong công nghệ của nhà cung cấp.

Nếu bạn đang quan sát dữ liệu giao dịch của ứng dụng của bạn được quản lý:

  • thực hiện mô hình Observer trong ứng dụng của bạn. Ví dụ. Trong Java, thông số kỹ thuật CDI và javabeans hỗ trợ trực tiếp này, và thiết kế tùy chỉnh OO theo cuốn sách của Gang Of Four là một giải pháp hoàn hảo.
  • tùy chọn gửi tin nhắn đến các ứng dụng khác. Bộ lọc/máy đánh chặn, tin nhắn MDB, sự kiện CDI và dịch vụ web cũng hữu ích cho việc thông báo.

Nếu người dùng đang trực tiếp sửa đổi dữ liệu tổng thể trong cơ sở dữ liệu, sau đó một trong hai:

  • cung cấp một trang quản trị số ít trong ứng dụng của bạn để kiểm soát dữ liệu tổng thể refresh HOẶC
  • cung cấp một ứng dụng quản lý dữ liệu tổng thể riêng biệt và gửi tin nhắn đến các ứng dụng phụ thuộc HOẶC
  • (cách tiếp cận tốt nhất) quản lý chỉnh sửa dữ liệu chính về chất lượng (đánh giá, thử nghiệm, v.v.) và thời gian (xử lý giống như thay đổi mã), quảng bá thông qua môi trường, triển khai và làm mới dữ liệu/khởi động lại ứng dụng để một shedule quản lý

Nếu bạn đang quan sát dữ liệu giao dịch bởi ứng dụng khác (tích hợp cơ sở dữ liệu được chia sẻ) quản lý HOẶC bạn sử dụng tích hợp dữ liệu cấp như ETL để cung cấp ứng dụng của bạn với dữ liệu:

  • cố gắng để có các thực thể dữ liệu được viết bởi chỉ một ứng dụng (chỉ dành cho những người khác)
  • bảng phân tích cuộc thăm dò/bảng điều khiển ETL để hiểu những gì/khi thay đổi xảy ra HOẶC
  • sử dụng tiện ích mở rộng độc quyền của JDBC/ODBC để thông báo hoặc bỏ phiếu, cũng được đề cập trong Alex Câu trả lời của Poole HOẶC
  • các hoạt động dữ liệu chồng chéo nhau từ 2 ứng dụng vào một dịch vụ SOA chia sẻ có thể tránh yêu cầu quan sát hoặc nâng nó từ một hoạt động dữ liệu lên một thông báo SOA/ứng dụng cao cấp hơn
  • sử dụng ESB hoặc bộ điều hợp cơ sở dữ liệu để gọi ứng dụng của bạn thông báo hoặc điểm cuối WS để chuyển dữ liệu hàng loạt (ví dụ: Apache Camel, Apache ServiceMix, Mule ESB, Openadaptor) sử dụng
  • tránh cơ sở hạ tầng mở rộng cơ sở dữ liệu như ống hoặc nâng cao xếp hàng

Nếu bạn sử dụng tin nhắn (gửi hoặc • Nhận), làm như vậy từ ứng dụng của bạn (s) . Nhắn tin từ DB là một chút của một antipattern. Như một phương sách cuối cùng, có thể sử dụng các trình kích hoạt gọi các dịch vụ web (http://www.oracle.com/technetwork/developer-tools/jdev/dbcalloutws-howto-084195.html), nhưng cần phải cẩn thận để thực hiện điều này theo cách rất thô, gọi một quy trình (phụ) kinh doanh khi một tập hợp dữ liệu thay đổi, thay vì crunching hoạt động loại CRUD hạt mịn. Tốt nhất để kích hoạt công việc và yêu cầu công việc gọi dịch vụ web bên ngoài giao dịch.

Các vấn đề liên quan