um. conceito
Em um ambiente de rede, o aplicativo de banco de dados é um padrão de estrutura C/S ou de várias camadas. Nesse ambiente, o desenvolvimento de aplicativos de banco de dados deve considerar reduzir a quantidade de transmissão de dados de rede o máximo possível e melhorar a simultaneidade o máximo possível. Com base nesse objetivo, surgiu uma tecnologia de atualização de dados em cache A operação é concluída, os dados são enviados ao banco de dados em um momento adequado, o que reduz bastante o tráfego de rede, reduz a carga no servidor de banco de dados e melhora o desempenho da simultaneidade.
Deve-se dizer que essa não é uma tecnologia muito nova. No entanto, o autor descobriu que alguns programadores não prestam atenção ao uso racional dessa tecnologia e ainda permanecem sob a idéia de aplicações independentes, resultando em ineficiência ou possíveis erros nos programas compilados. Portanto, é necessário resumir as vantagens, princípios e métodos de aplicação dessa tecnologia (tomando o Delphi como exemplo).
dois. Prós e contras
A tecnologia de atualização de dados com cache tem as seguintes vantagens:
(1) Minimize o tráfego da rede e reduza o tempo de acesso a dados. Melhore a eficiência dos operadores de banco de dados de clientes.
(2) Reduz a carga no servidor de banco de dados, porque muitas atualizações repetidas, modificações e operações de exclusão podem ser concluídas no buffer do cliente, e os resultados são enviados apenas ao servidor no final.
(3) Reduza efetivamente o tempo de processamento da transação e reduz a taxa de transferência de transações simultâneas. Isso pode garantir melhor a consistência do banco de dados.
Podemos dar um exemplo para ilustrar sua superioridade: o operador do banco de dados insere um registro de dados no banco de dados, mas imediatamente constata que o registro não atende aos requisitos, então ele exclui os dados. Nesse processo, se a tecnologia de atualização de dados sem buffer for usada, o lado do servidor executará uma operação de inserção e uma operação de exclusão e conduzirá duas transmissões de dados de ida e volta no lado do cliente e do servidor, e se esses dados forem usados para estar com Outras tabelas de banco de dados. Se o método de atualização de dados for adotado com o cache, essas duas etapas das operações inversas poderão ser concluídas no buffer de dados do cliente sem nenhuma ação no lado do servidor, e nenhuma atualização de dados de dados e em cascata será gerada. Isso mostra as enormes vantagens da tecnologia de atualização de dados em buffer.
Uma desvantagem da atualização de dados com o cache é que, como os dados são armazenados no cliente, se os dados forem alterados por outros usuários, causará situações inconsistentes, como perda e modificação. considere totalmente as variáveis. A aplicação dessa tecnologia requer certas habilidades e certas mudanças de pensamento.
três. Princípios de aplicação
As vantagens de qualquer tecnologia são refletidas em um determinado ambiente.
(1) Ocasões de aplicativos de banco de dados C/S ou de várias camadas. Nesse caso, o tráfego de rede pode ser efetivamente reduzido. Em situação independente, a tecnologia não faz sentido.
(2) No caso de atualização de dados de várias tabelas. Por exemplo, na atualização da tabela principal/estrutura de detalhes, a adição e a exclusão das duas tabelas geralmente se afetam. Isso diminui efetivamente o tempo de transação e garante a consistência dos dados.
(3) em ocasiões em que a capacidade de carga do servidor é limitada. Atualmente, com o aumento da velocidade dos PCs e a diminuição do preço, a diferença nos recursos de clientes e servidores está ficando cada vez menor e os recursos de serviço dos servidores são relativamente reduzidos. Objetivamente, é necessário reduzir a carga no servidor da perspectiva do software, enquanto as atualizações de dados em buffer reduzem a carga do servidor, compartilhando parte da tarefa de atualização pelo cliente.
(4) No caso em que a probabilidade de dados sendo atualizados ao mesmo tempo é relativamente baixa. Se os mesmos dados no banco de dados provavelmente serão atualizados por vários usuários no mesmo período, essa situação não será adequada para atualizações em armazenamento em cache, porque neste caso, a substituição de erros dos dados é facilmente gerada, resultando em inconsistência de dados.
Quatro. Visão geral dos métodos de controle em Delphi
Como uma ferramenta popular de desenvolvimento de banco de dados, a Delphi possui funções de manipulação de banco de dados ricas. A Delphi fornece suporte abrangente para a tecnologia de acesso a dados em buffer. Geralmente, o Delphi fornece aos usuários vários controles de conjunto de dados para acessar tabelas de banco de dados, como TTABLE e TTQUERY; Existe uma opção CacheDupdate no controle da propriedade do conjunto de dados. , somente quando o método submetido real (como ApplUpDates (), etc.) é chamado, o Delphi reflete os dados enviados reais ao banco de dados. Seja atualizado quando a tabela de banco de dados é realmente atualizada. Isso fornece conveniência para controlarmos as etapas da submissão de dados. Além disso, através deste modelo, reduz bastante a duração das transações, reduz o tráfego da rede e aumenta a confiabilidade do aplicativo. Abaixo, fornecemos um módulo de aplicativo específico para ilustrar como usar esse modelo de programação.
cinco. Exemplo de programa Delphi
(1) Descrição do fundo do aplicativo
Suponha que criemos um módulo para o processamento de pedidos de produto. Este módulo envolve três tabelas de banco de dados: Ordem da tabela de pedidos (com campos como ID do pedido, quantia sujo, data, nome do cliente, etc.), detalhe do pedido (com ID do pedido de pedido, ID do pedido e número do produto CommOngityId), Ordem Detalhes (com ID do pedido, ID do pedido e número do produto CommOngityId, quantidade de quantidade, preço unitário do preço e outros campos), armazenamento de tabela de inventário (incluindo o número do produto CommondityId, ações existentes e outros campos). Entre eles, o pedido e a lista de pedidos são relacionamentos de um para muitos, com o número do pedido OrderId como campo de conexão. Sempre que um pedido é adicionado, a tabela de inventário deve ser modificada e a quantidade de mercadorias correspondentes vendidas é subtraída do inventário.
(2) Descrição da estrutura do programa
A seguir, é apresentada uma estrutura para os programas Delphi, que explica aproximadamente como usar o modo de programação de atualizações de cache. Os leitores podem melhorar ainda mais as funções deste programa sozinhas.
ordem unitária;
{Nome da unidade}
interface
usos
{módulo referenciado}
Janelas, mensagens, sysutils, variantes, classes, gráficos, controles, formulários,
Diálogos, grades, dbgrids, extctrls, dbctrls, ferramentas win, actnman, actnctrls,
Actnmenus, DB, DBTables;
Tipo
{Variáveis declaradas, controles adicionados e métodos e procedimentos definidos}
TODERMFORMENT = CLASS (TForm)
Tborder: ttable;
Tbdetail: ttable;
OrderDB: TDATABASE;
ActionMainMenubar1: TactionMainMenubar;
Dbnavigator1: tdbnavigator;
DbGrid1: tdbGrid;
procedimento tborderafterpost (conjunto de dados: tdataset);
procedimento tbdetailnewrecord (conjunto de dados: tdataset);
procedimento tbdetailupdaterecord (conjunto de dados: tdataset;
Updatekind: tupdatekind;
procedimento tbdetailafterpost (conjunto de dados: tdataset);
Procedimento FormCreate (remetente: Tobject);
Privado
{Declarações privadas}
público
{Declarações públicas}
fim;
var
OrderForm: TorderForm;
Implementação
{$ R *.dfm}
{O seguinte é a estrutura principal do programa}
procedimento TorderForm.FormCreate (remetente: Tobject);
{Defina as opções de atualização do cache para a tabela principal e tabela detalhada como true}
Começar
Tborder.cachedupdates: = true;
Tbdetail.cachedupdates: = true;
fim;
procedimento TODERMFORM.TBORDERAFTERPOST (DataSet: TDataset);
{Depois de enviar a atualização da tabela de pedidos, execute o conteúdo desse processo.
Nota: Se a propriedade CachedUpdates de um conjunto de dados for verdadeira,
Em seguida, a ação post é apenas uma ação de compromisso no buffer do cliente.
Em vez de realmente enviá -lo para o banco de dados real. Para alcançar um verdadeiro commit,
A instrução APLICUPDATES é necessária. }
Começar
Orderdb.starttransaction; // A transação de atualização inicia a execução
tentar
Tborder.applyupdates; // Atualização real para a tabela principal
Tbdetail.applyupdates; // atualizações reais na lista detalhada
exceto
Orderdb.rollback; // Se ocorrer um acidente, recue a transação e saia do processo
saída;
fim;
Orderdb.commit; // Se nenhum acidente ocorrer, preencha o compromisso da transação
Tborder.ComMitupDates; // Limpe o buffer do cliente da tabela de tuminosidade
Tbdetail.Commitupdates; // Limpe o buffer do cliente da tabela TBDetail
fim;
Procedimento TODERMFORM.TBDETAILNEWRECORD (DataSet: TDataSet);
{A ação concluída quando uma lista detalhada é adicionada. }
Começar
Tbdetail.fieldbyname ('OrderId'). Asinteger: = tborder.fieldbyname ('OrderId'). Asinteger;
Arquivo: // Atribua o campo OrderId da tabela principal ao campo OrderId da tabela detalhada.
fim;
Procedimento TODERFORM.TBDETAILUPDATERECORD (DataSet: TDataSet;
Updatekind: tupdatekind;
{Quando a tabela de banco de dados é realmente atualizada, as operações que precisam ser executadas simultaneamente são definidas no evento OnUpDateRecord.
Nesse caso, é executada uma operação de atualização em cascata da lista detalhada e da tabela de inventário.
Preste atenção: as operações executadas nesse processo são ações executadas quando o banco de dados é realmente atualizado.
Em vez das ações executadas ao atualizar os dados em cache do cliente}
Var temp_Query: TQUERY;
Começar
Se atualizar
com temp_query fazer
Começar
fechar;
Sql.clear;
Sql.add ('Atualize o conjunto de armazenamento Stocks = Stocks-: valor');
Sql.add ('where CommonditityId =: CommondityId');
ParambyName ('valor'): = tborder.fieldbyName ('vale'). Asfloat;
ParambyName ('CommOndityId'): = tbdetai.fieldbyname ('CommOndityId'). Asinteger;
ExecSQL;
fim;
fim;
procedimento TODERFORM.TBDETAILAFTERPOST (DataSet: TDataSet);
{Depois de modificar os registros na tabela detalhada e enviar (post), execute as instruções nesse processo.
Preste atenção: esse tipo de envio é direcionado aos dados do cliente e não se reflete realmente no banco de dados.
Neste exemplo, a função implementada é calcular o campo da quantidade total da tabela principal}
Começar
Tborder.fieldbyname ('dinheiro'): = 0;
com tbdetail fazer
Começar
primeiro;
Embora não seja o
Começar
Tborder.fieldbyname ('dinheiro'): = tborder.fieldbyname ('dinheiro')+
FieldByName ('Price'). Asfloat*FieldByName ('valor');
Arquivo: // Acumula a quantidade da tabela detalhada para o campo de quantidade da tabela principal
próximo;
fim;
fim;
fim;
fim.