Apakah polling satu-satunya cara untuk memperbarui data aplikasi dari database?

17

Aplikasi perlu memiliki data yang lebih baru diperbarui dari database mungkin. Dalam kasus seperti itu, apakah ada cara lain untuk mendapatkan data, selain dari penghitung waktu berbasis database (polling)?

Saya bekerja dengan MS SQL Server 2008 (dan aplikasi .NET + Kerangka Entitas), tetapi saya ingin mengetahui tentang jenis-jenis database lain juga.

rem
sumber
Microsoft StreamInsight dirancang khusus untuk mengaktifkan pemrosesan berbasis "data event". Saya tidak tahu banyak tentang itu, tetapi sepertinya platform yang lengkap dan independen daripada fitur individual SQL Server. Berikut adalah diagram arsitektur StreamInsight .
Nick Chammas

Jawaban:

5

Pialang Layanan untuk SQL Server 2005+ dapat melakukan ini.

Maaf, saya tidak yakin dengan RDBMS lainnya

gbn
sumber
2
Bisakah Anda menguraikan bagaimana Broker Layanan melakukan ini? @rem bertanya tentang mengambil pembaruan yang dipicu oleh peristiwa (bukan yang dipicu oleh waktu) dari database. SB untuk proses antrian dan asyc.
Nick Chammas
1
-1 Pialang Layanan sepertinya tidak memiliki apa pun di dalamnya untuk memberi tahu aplikasi bahwa ia telah menerima pesan. (Saat ini saya terjebak pada masalah ini.)
Vaccano
10

Di Oracle Anda dapat menggunakan paket DBMS_ALERT bawaan untuk memfasilitasi ini.

DBMS_ALERT mendukung pemberitahuan asinkron dari peristiwa basis data (peringatan). Dengan penggunaan yang tepat dari paket ini dan pemicu basis data, aplikasi dapat memberi tahu dirinya sendiri kapan pun nilai yang menarik dalam basis data diubah.

Misalkan alat grafis menampilkan grafik beberapa data dari tabel database. Alat grafis dapat, setelah membaca dan membuat grafik data, menunggu pada peringatan basis data (WAITONE) yang mencakup data yang baru saja dibaca. Alat secara otomatis bangun ketika data diubah oleh pengguna lain. Semua yang diperlukan adalah bahwa pemicu ditempatkan pada tabel database, yang melakukan sinyal (SIGNAL) setiap kali pemicu dipecat.

Leigh Riffel
sumber
Dan untuk "MS SQL Server 2008" sesuai pertanyaan OP? Mereka meminta RDBMS lain tetapi ini sebenarnya tidak membantu.
gbn
9
@ GBN Mengapa tidak membantu? Saya tidak bisa menjawab bagian SQL Server seperti yang Anda bisa, jadi saya menjawab bagian yang saya bisa. Tidak ada yang ahli dalam semua database lain, tetapi jika kita masing-masing menyumbangkan pengetahuan kita, OP dan pengunjung masa depan akan menemukan informasi yang berguna. Saya mengharapkan OP untuk menerima jawaban SQL Server dan memilih jawaban yang berguna lainnya seperti ScottCher's (+1).
Leigh Riffel
kata baik. Setelah membaca jawaban DBMS_ALERT Anda, saya belajar cara lain untuk melakukannya - lebih banyak alat untuk kotak alat! +1
ScottCher
7

Vendor basis data tertentu juga menyediakan bus pesan terintegrasi yang hanya dapat dilanggan oleh aplikasi Anda:

Alternatifnya adalah dengan merute data ke dalam database di tempat pertama melalui bus pesan seperti Tibco / RV dan cukup "cabang" itu, on stream pergi ke DB dan satu pergi ke aplikasi Anda, atau menggunakan lapisan caching seperti Coherence antara aplikasi Anda dan DB.

Gayus
sumber
7

DENGARKAN / PEMBERITAHUAN untuk PostgreSQL

http://www.postgresql.org/docs/current/static/sql-notify.html

dalam database ...

NOTIFY static_channel_name, 'static-message';

atau dalam suatu fungsi / pemicu:

perform pg_notify('dynamic-channel-name', 'dynamic-message');

di klien basis data:

LISTEN some_channel_name; --note the lack of quotes

Klien LISTEN akan menerima ID proses PostgreSQL, nama saluran, dan nilai pesan.

Driver JDBC standar untuk PostgreSQL tidak suka notifikasi, namun Anda dapat menggunakan https://github.com/impossibl/pgjdbc-ng driver untuk tujuan ini

Neil McGuigan
sumber
5

Solusi Oracle lainnya: Kami telah mengembangkan aplikasi menggunakan kerangka kerja dotnet dari Microsoft yang memanfaatkan fitur Pemberitahuan Perubahan Database Oracle bersama dengan ODP.Net (penyedia data Oracle untuk dotnet). Dengan menggunakan ini, database sebenarnya memberitahukan aplikasi dotnet ketika data baru telah tiba memungkinkan kita untuk menghindari polling yang konstan. Tautan yang saya referensi di atas adalah tutorial Oracle untuk melakukan hal itu. Semoga ini bisa membantu Anda.

Tidak tahu tentang RDBMS lainnya.

ScottCher
sumber
2

Untuk salah satu aplikasi kami (diakses melalui Chrome dan ONLY Chrome), kami menggunakan MySQL dengan sys_exec UDF . Pada dasarnya, mengapa Chrome - karena dukungan WebSocket.

Setelah pembaruan / masukkan / hapus yang kritis terjadi, program eksternal dijalankan melalui fungsi sys_exec yang baru ditambahkan yang tertanam dalam pemicu tertentu. Pada saat itu, kami memiliki semua yang kami butuhkan untuk menyampaikan pesan ke setiap klien yang terhubung tanpa perlu polling atau beberapa pertanyaan karena semuanya terjadi secara real-time.

Furicane
sumber
1

Kami menggunakan kombinasi Oracle GoldenGate dan Java Persistence API (JPA) untuk melakukan ini dengan database Oracle, tetapi juga dengan DB2, Sybase, Microsoft SQL Server, MySQL, Teradata, dll. Fitur ini dijelaskan di sini: http: // docs .oracle.com / middleware / 1212 / coherence / COHIG / golden_g.htm

Apa yang dilakukan GoldenGate adalah mengubah log transaksi basis data menjadi aliran peristiwa yang dapat difilter yang dapat dikonsumsi di mana saja di seluruh jaringan. Kami menggunakannya untuk mengubah transaksi yang relevan menjadi pembaruan cache atau pembatalan cache, yang keduanya dapat memicu peristiwa tingkat aplikasi, misalnya mendorong data sepenuhnya ke aplikasi desktop atau HTML5 websocket.

(Untuk pengungkapan penuh, saya bekerja di Oracle pada salah satu produk menggunakan GoldenGate.)

canggung
sumber