Yoklama, uygulamanın verilerini bir veritabanından güncellemenin tek yolu mudur?


17

Bir uygulamanın, verileri bir veritabanından olabildiğince yeni güncellenmesi gerekir. Böyle bir durumda, veritabanını talep eden (yoklama) tabanlı bir zamanlayıcı tabanlı veri almanın başka bir yolu var mı?

Bir MS SQL Server 2008 (ve .NET uygulamaları + Entity Framework) ile çalışıyorum, ancak diğer veritabanları hakkında da bilgi edinmek istiyorum.


Microsoft StreamInsight , "veri olayı" tabanlı işlemeyi etkinleştirmek için özel olarak tasarlanmıştır. Bu konuda çok şey bilmiyorum, ancak SQL Server'ın bireysel bir özelliği yerine tam ve bağımsız bir platform gibi görünüyor. İşte bir StreamInsight mimari şeması .
Nick Chammas

Yanıtlar:


5

SQL Server 2005+ için Service Broker bunu yapabilir.

Üzgünüm, diğer RDBMS'den emin değilim


2
Service Broker'ın bunu nasıl yaptığını ayrıntılı olarak açıklayabilir misiniz? @rem, olay tetiklemeli (zaman tetiklemenin aksine) veritabanından güncellemeler almayı soruyor. SB kuyruğa alma ve asyc işleme içindir.
Nick Chammas

1
-1 Service Broker, bir uygulamaya bir ileti aldığını bildirmek için yerleşik bir şey yok gibi görünüyor. (Şu anda bu konuda takılı
kalıyorum

10

Oracle'da bunu kolaylaştırmak için yerleşik DBMS_ALERT paketini kullanabilirsiniz.

DBMS_ALERT veritabanı olaylarının (uyarılar) eşzamansız bildirimini destekler. Bu paket ve veritabanı tetikleyicilerinin uygun şekilde kullanılmasıyla, bir uygulama veritabanındaki ilgili değerler her değiştiğinde kendisini bildirebilir.

Bir grafik aracının, bir veritabanı tablosundan bazı verilerin grafiğini görüntülediğini varsayalım. Grafik aracı, verileri okuduktan ve grafik oluşturduktan sonra, sadece okunan verileri kapsayan bir veritabanı uyarısını (WAITONE) bekleyebilir. Veriler başka herhangi bir kullanıcı tarafından değiştirildiğinde araç otomatik olarak uyanır. Gerekli olan tek şey, tetikleyici her tetiklendiğinde bir sinyal (SIGNAL) yapan veritabanı tablosuna bir tetikleyicinin yerleştirilmesidir.


Ve OPs sorusuna göre "MS SQL Server 2008" için? Diğer RDBMS'leri istediler ama bu aslında yardımcı olmuyor.
gbn

9
@gbn Neden yardımcı olmuyor? SQL Server bölümünü olabildiğince yanıtlayamıyorum, bu yüzden yapabildiğim yanıtı verdim. Hiç kimse diğer tüm veritabanlarında uzman değildir, ancak her birimiz bilgimize katkıda bulunursak, OP ve gelecekteki ziyaretçiler yararlı bilgiler bulacaktır. OP'nin bir SQL Server yanıtını kabul etmesini ve ScottCher (+1) gibi diğer yararlı cevapları oylamasını beklerim.
Leigh Riffel

iyi dedi. DBMS_ALERT yanıtınızı okuduktan sonra, bunu yapmanın başka bir yolunu öğrendim - araç kutusu için daha fazla araç! +1
ScottCher

7

Bazı veritabanı satıcıları, uygulamanızın abone olabileceği entegre mesaj otobüsleri de sağlar:

Alternatif olarak, verileri ilk etapta veritabanına Tibco / RV gibi bir mesaj veri yolu üzerinden yönlendirmek ve basitçe " dallamak ", DB'ye giden ve uygulamanıza giden akışta veya Coherence gibi bir önbellek katmanı kullanmak olabilir. uygulamanız ve DB arasında.


7

PostgreSQL için DİNLE / BİLDİR

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

veritabanında ...

NOTIFY static_channel_name, 'static-message';

veya bir işlev / tetikleyicide:

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

veritabanı istemcisinde:

LISTEN some_channel_name; --note the lack of quotes

LISTEN istemcisi PostgreSQL işlem kimliğini, kanal adını ve ileti değerini alacaktır.

PostgreSQL için standart JDBC sürücüsü bildirimleri sevmez, ancak bu amaç için https://github.com/impossibl/pgjdbc-ng sürücüsünü kullanabilirsiniz


5

Başka bir Oracle çözümü: ODP'nin (dotnet için Oracle veri sağlayıcısı) ile birlikte Oracle'ın Veritabanı Değişikliği Bildirimi özelliğinden yararlanan Microsoft'un dotnet çerçevesini kullanarak uygulamalar geliştirdik . Bunu kullanarak, yeni veriler geldiğinde veritabanı gerçekte dotnet uygulamasını bilgilendirir ve sürekli yoklamayı önler. Yukarıda bahsettiğim bağlantı, tam da bunu yapmak için bir Oracle eğitimidir. Umarım bu size yardımcı olur.

Diğer RDBMS'leri bilmiyorum.


2

Uygulamalarımızdan biri için (Chrome ve SADECE Chrome üzerinden erişilir), MySQL'i sys_exec UDF ile kullanıyoruz . Temel olarak, neden Chrome - WebSocket desteği nedeniyle.

Kritik bir güncelleme / ekleme / silme işlemi gerçekleştiğinde, belirli tetikleyicilere gömülü yeni eklenen sys_exec işlevselliği ile harici bir program çağrılır. Bu noktada, her şey gerçek zamanlı olarak gerçekleştiğinden, yoklama veya birden çok sorguya gerek kalmadan mesajı bağlı her müşteriye aktarmak için ihtiyacımız olan her şeye sahibiz.


1

Biz Oracle veritabanı ile bunu yapmak Oracle Goldengate ve Java Persistence API (JPA) bir arada kullanmakla kalmayıp DB2 ile, vb Sybase, Microsoft SQL Server, MySQL, Teradata, özellik burada tarif edilir: http: // docs .oracle.com / katman / 1212 / tutarlılık / COHIG / golden_g.htm

GoldenGate'in yaptığı şey, veritabanı işlem günlüğünü ağın herhangi bir yerinde tüketilebilecek filtrelenebilir bir olay akışına dönüştürmektir. İlgili işlemleri önbellek güncellemelerine veya önbellek geçersiz kılmalarına dönüştürmek için kullanıyoruz; bunların her ikisi de uygulama düzeyinde olayları tetikleyebilir; örneğin, verileri masaüstü veya HTML5 websocket uygulamalarına sonuna kadar itmek.

(Tam açıklama için Oracle'da GoldenGate kullanan ürünlerden birinde çalışıyorum.)

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.