A pesquisa é a única maneira de atualizar os dados do aplicativo a partir de um banco de dados?

17

Um aplicativo precisa ter os dados o mais atualizados possível a partir de um banco de dados. Nesse caso, existe outra maneira de obter os dados, além de um cronômetro solicitar (pesquisar) o banco de dados?

Trabalho com um MS SQL Server 2008 (e aplicativos .NET + Entity Framework), mas também gostaria de conhecer outros tipos de bancos de dados.

rem
fonte
O Microsoft StreamInsight foi projetado especificamente para habilitar o processamento baseado em "evento de dados". Não sei muito sobre isso, mas parece uma plataforma completa e independente, e não um recurso individual do SQL Server. Aqui está um diagrama da arquitetura do StreamInsight .
Nick Chammas

Respostas:

5

O Service Broker para SQL Server 2005+ pode fazer isso.

Desculpe, não tenho certeza de outros RDBMS

gbn
fonte
2
Você pode elaborar como o Service Broker faz isso? O @rem está perguntando sobre a recuperação de atualizações acionadas por eventos (em oposição a acionadas por tempo) de um banco de dados. SB é para enfileiramento e processamento assíncrono.
Nick Chammas
1
-1 O Service Broker parece não ter nada incorporado para que um aplicativo saiba que recebeu uma mensagem. (Atualmente, estou preso sobre esta questão.)
Vaccano
10

No Oracle, você pode usar o pacote DBMS_ALERT interno para facilitar isso.

DBMS_ALERT suporta notificação assíncrona de eventos do banco de dados (alertas). Pelo uso apropriado deste pacote e dos gatilhos do banco de dados, um aplicativo pode notificar-se sempre que os valores de interesse no banco de dados são alterados.

Suponha que uma ferramenta gráfica esteja exibindo um gráfico de alguns dados de uma tabela de banco de dados. A ferramenta gráfica pode, após ler e representar graficamente os dados, aguardar um alerta do banco de dados (WAITONE) cobrindo os dados que acabou de ler. A ferramenta é ativada automaticamente quando os dados são alterados por qualquer outro usuário. Tudo o que é necessário é que um gatilho seja colocado na tabela do banco de dados, que executa um sinal (SIGNAL) sempre que o gatilho for disparado.

Leigh Riffel
fonte
E para "MS SQL Server 2008" conforme a pergunta dos OPs? Eles pediram outros RDBMS, mas isso realmente não ajuda.
gbn 4/03/11
9
@gbn Por que isso não ajuda? Não consigo responder a parte do SQL Server como você pode, então respondi a parte que pude. Ninguém é especialista em todos os outros bancos de dados, mas se cada um de nós contribuir com nosso conhecimento, o OP e futuros visitantes encontrarão informações úteis. Espero que o OP aceite uma resposta do SQL Server e vote outras respostas úteis como a de ScottCher (+1).
Leigh Riffel
bem dito. Depois de ler sua resposta DBMS_ALERT, aprendi outra maneira de fazer isso - mais ferramentas para a caixa de ferramentas! 1
ScottCher 4/03
7

Certos fornecedores de banco de dados também fornecem barramentos de mensagens integrados nos quais seu aplicativo pode simplesmente se inscrever:

Uma alternativa seria rotear os dados para o banco de dados em primeiro lugar por meio de um barramento de mensagens como o Tibco / RV e simplesmente "ramificá-lo", no fluxo que entra no banco de dados e outro que vai para o seu aplicativo, ou usa uma camada de cache como Coherence entre seu aplicativo e o banco de dados.

Gaius
fonte
7

LISTEN / NOTIFY para PostgreSQL

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

no banco de dados ...

NOTIFY static_channel_name, 'static-message';

ou em uma função / gatilho:

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

no cliente de banco de dados:

LISTEN some_channel_name; --note the lack of quotes

O cliente LISTEN receberá o ID do processo do PostgreSQL, o nome do canal e o valor da mensagem.

O driver JDBC padrão para o PostgreSQL não gosta de notificações, no entanto, você pode usar o https://github.com/impossibl/pgjdbc-ng para essa finalidade

Neil McGuigan
fonte
5

Outra solução Oracle: desenvolvemos aplicativos usando a estrutura dotnet da Microsoft que aproveitam o recurso de Notificação de Mudança de Banco de Dados da Oracle em conjunto com o ODP.Net (o provedor de dados Oracle para dotnet). Usando isso, o banco de dados notifica o aplicativo dotnet quando novos dados chegam, o que nos permite evitar pesquisas constantes. O link que refiro acima é um tutorial da Oracle para fazer exatamente isso. Espero que isso ajude você.

Não conheço nenhum outro RDBMS.

ScottCher
fonte
2

Para um de nossos aplicativos (acessado através do Chrome e ONLY Chrome), estamos usando o MySQL com sys_exec UDF . Basicamente, por que o Chrome - devido ao suporte do WebSocket.

Depois que uma atualização / inserção / exclusão crítica ocorre, um programa externo é chamado através da funcionalidade sys_exec recém-adicionada incorporada em determinados gatilhos. Nesse ponto, temos tudo o que precisamos para transmitir a mensagem a todos os clientes conectados, sem a necessidade de pesquisas ou várias consultas, pois tudo acontece em tempo real.

Furicane
fonte
1

Usamos uma combinação do Oracle GoldenGate e da Java Persistence API (JPA) para fazer isso com o banco de dados Oracle, mas também com o DB2, Sybase, Microsoft SQL Server, MySQL, Teradata etc. O recurso é descrito aqui: http: // docs .oracle.com / middleware / 1212 / coerência / COHIG / golden_g.htm

O que o GoldenGate faz é transformar o log de transações do banco de dados em um fluxo de eventos filtrável que possa ser consumido em qualquer lugar da rede. Nós o usamos para transformar transações relevantes em atualizações de cache ou invalidações de cache, as quais podem desencadear eventos no nível do aplicativo, por exemplo, enviando os dados para aplicativos de desktop ou HTML5 da Web.

(Para divulgação completa, trabalho na Oracle em um dos produtos usando o GoldenGate.)

cpurdy
fonte