¿Es la encuesta la única forma de actualizar los datos de la aplicación desde una base de datos?

17

Una aplicación necesita tener datos lo más actualizados posible desde una base de datos como sea posible. En tal caso, ¿hay alguna otra forma de obtener los datos, además de un temporizador que solicita (sondea) la base de datos?

Trabajo con un servidor MS SQL Server 2008 (y aplicaciones .NET + Entity Framework), pero también me gustaría conocer otros tipos de bases de datos.

movimiento rápido del ojo
fuente
Microsoft StreamInsight está diseñado específicamente para habilitar el procesamiento basado en "eventos de datos". No sé mucho al respecto, pero parece una plataforma completa e independiente en lugar de una característica individual de SQL Server. Aquí hay un diagrama de arquitectura de StreamInsight .
Nick Chammas

Respuestas:

5

Service Broker para SQL Server 2005+ puede hacer esto.

Lo siento, no estoy seguro de otros RDBMS

gbn
fuente
2
¿Puede explicar cómo Service Broker hace esto? @rem pregunta sobre la recuperación de actualizaciones activadas por eventos (en oposición a las activadas por tiempo) de una base de datos. SB es para el procesamiento de colas y asyc.
Nick Chammas
1
-1 Service Broker no parece tener nada incorporado para que una aplicación sepa que ha recibido un mensaje. (Actualmente estoy atascado en este tema.)
Vaccano
10

En Oracle puede usar el paquete incorporado DBMS_ALERT para facilitar esto.

DBMS_ALERT admite notificaciones asíncronas de eventos de la base de datos (alertas). Mediante el uso apropiado de este paquete y los desencadenantes de la base de datos, una aplicación puede notificarse a sí misma cada vez que se cambian los valores de interés en la base de datos.

Supongamos que una herramienta gráfica muestra un gráfico de algunos datos de una tabla de base de datos. La herramienta gráfica puede, después de leer y graficar los datos, esperar una alerta de la base de datos (WAITONE) que cubre los datos que acaba de leer. La herramienta se activa automáticamente cuando cualquier otro usuario cambia los datos. Todo lo que se requiere es que se coloque un disparador en la tabla de la base de datos, que realiza una señal (SEÑAL) cada vez que se dispara el disparador.

Leigh Riffel
fuente
¿Y para "MS SQL Server 2008" según la pregunta de los OP? Pidieron otros RDBMS pero esto en realidad no ayuda.
gbn
9
@gbn ¿Por qué no ayuda? No puedo responder la parte del Servidor SQL como tú, así que respondí la parte que pude. Nadie es un experto en todas las demás bases de datos, pero si aportamos nuestro conocimiento, el OP y los futuros visitantes encontrarán información útil. Esperaría que el OP acepte una respuesta de SQL Server y vote otras respuestas útiles como ScottCher (+1).
Leigh Riffel
bien dicho. Después de leer su respuesta DBMS_ALERT, aprendí otra forma de hacerlo: ¡más herramientas para la caja de herramientas! +1
ScottCher
7

Ciertos proveedores de bases de datos también proporcionan buses de mensajes integrados a los que su aplicación simplemente puede suscribirse:

Una alternativa sería enrutar los datos en la base de datos en primer lugar a través de un bus de mensajes como Tibco / RV y simplemente "ramificarlos", en la secuencia que va a la base de datos y uno que va a su aplicación, o usar una capa de almacenamiento en caché como Coherence entre tu aplicación y el DB.

Gayo
fuente
7

ESCUCHAR / NOTIFICAR para PostgreSQL

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

en la base de datos ...

NOTIFY static_channel_name, 'static-message';

o en una función / disparador:

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

en el cliente de la base de datos:

LISTEN some_channel_name; --note the lack of quotes

El cliente LISTEN recibirá el ID del proceso PostgreSQL, el nombre del canal y el valor del mensaje.

Al controlador JDBC estándar para PostgreSQL no le gustan las notificaciones, sin embargo, puede usar el controlador https://github.com/impossibl/pgjdbc-ng para este propósito

Neil McGuigan
fuente
5

Otra solución de Oracle: hemos desarrollado aplicaciones que utilizan el marco dotnet de Microsoft que aprovechan la función de Notificación de cambio de base de datos de Oracle junto con ODP.Net (el proveedor de datos de Oracle para dotnet). Al usar esto, la base de datos notifica a la aplicación dotnet cuando llegan nuevos datos, lo que nos permite evitar sondeos constantes. El enlace al que hago referencia anteriormente es un tutorial de Oracle para hacer precisamente eso. Espero que esto te ayude.

No sé sobre ningún otro RDBMS.

ScottCher
fuente
2

Para una de nuestras aplicaciones (a través de Chrome y SOLO Chrome), estamos usando MySQL con sys_exec UDF . Básicamente, por qué Chrome, debido al soporte de WebSocket.

Una vez que se produce una actualización / inserción / eliminación crítica, se invoca un programa externo a través de la funcionalidad sys_exec recientemente agregada incorporada en ciertos disparadores. En ese momento, tenemos todo lo que necesitamos para transmitir el mensaje a cada cliente conectado sin necesidad de encuestas o consultas múltiples, ya que todo sucede en tiempo real.

Furicano
fuente
1

Utilizamos una combinación de Oracle GoldenGate y Java Persistence API (JPA) para hacer esto con la base de datos Oracle, pero también con DB2, Sybase, Microsoft SQL Server, MySQL, Teradata, etc. La característica se describe aquí: http: // docs .oracle.com / middleware / 1212 / coherence / COHIG / golden_g.htm

Lo que GoldenGate hace es convertir el registro de transacciones de la base de datos en una secuencia de eventos filtrable que se puede consumir en cualquier lugar de la red. Lo usamos para convertir transacciones relevantes en actualizaciones de caché o invalidaciones de caché, que pueden desencadenar eventos a nivel de aplicación, por ejemplo, enviar los datos a aplicaciones de escritorio o HTML5 websocket.

(Para una divulgación completa, trabajo en Oracle en uno de los productos con GoldenGate).

cpurdy
fuente