[firebase-br] RES: Sugestão para desempenho no Firebird
Artur Anjos
listas em arturanjos.com
Qua Abr 2 19:38:40 -03 2008
O IBO tem muitas coisas que ajudam o programador a verificar as suas
transações.
Ele utiliza transações "logicas" para controlar as transações "físicas".
Isto é, o IBO controla as transações para verificar se existiu alguma
alteração desde que a transação foi "comitada" pela ultima vez.
Uma coisa que você deverá começar a usar desde logo é a Form de Status
(IBF_Status), que lhe mostra uma quantidade de informação util sobre
todas as transações activas no momento. Ele até lhe mostra a duração da
mesma (Time Active)!
O IBO "sabe" que a sua transação deve ser a mais curta possível, pelo
que é suficientemente "inteligente" para a encerrar se verificar que o
pode fazer.
Quando você faz um "prepare" a sua transação fisica é iniciada. Esta é
finalizada quando você faz "close" (se o autocommit estiver activo ela
irá ser comitada, senão será rollback), quando você faz "commit" ou
quando você faz "rollback".
Mas como já afirmei antes (e afrmo agora de novo porque o Carlos Cantu
está a contar as palavras, e assim aproveito para escrever mais algumas)
o IBO "preocupa-se" com manter as transacções o mais curtas possíveis, e
se não existir qualquer alteração o IBO faz uma "pausa" na transação.
Como o Firebird não aceita pausas na transacção, o qu eo IBO faz na
realidade é fechar a transação e voltar a abri-la, sem informar os
Dataset activos, e no final faz um refresh do dataset.
Para que tal aconteça, você necessita de possuir um IB_SessionProps na
sua aplicação. Sem IB_session, o "timer" responsável por esta "magia"
não fica activo.
Na instalação do IBO, você tem vários exemplos que mostram o conjunto a
trabalhar. Procure o Transaction Pausing que lhe mostra exactamente o
que falei aqui em tempo real.
Agora respondendo à sua pergunta com "receita de bolo": quando fecha a
query ela a transação automatica fecha tambem, como expliquei em cima.
Mas o problema está na altura que abre a query. É aí que o utilizador
fica mais tempo - imagina que a sua query alimenta uma grid, que o user
pode chegar, abrir a "grelha" e ir beber o café da manhã, bater o papo
com a boazona do marketing, falar com a gostosona do marketing, e lá tá
a %$##%$ da transação a manter a "oldest active transaction" cá em
baixo. Com o IBO (e com a SessionProps) a grelha mantinha-se lá com os
dados visiveis, a transação era fechada, e só quando o utilizador
fizesse algo que mudasse a grelha é que a ytransação era de novo aberta.
Mas não deixe de seguir o meu conselho e coloca uma IB_Status na sua
aplicação. Mesmo que seja "easter egg" e que só você a active. Quando
chegar no seu cliente, procura uma estação de trabalho que esteja aberta
faz horas e verifica o estado de todas as transações, há quanto tempo
estão activas, etc. Aprenda a usar o IBO que ele controla isto tudo por
você. Ainda há casos muito específicos como o utilizador começar a
editar e depois sair para falar com a tal gostosona do marketing, mas se
você deixar o IBO controlar maior parte da aplicação, você irá ter tempo
para se dedicar a estes pormenores que só aocntecem uma vez por mil (nem
todas as empresas tem gostosonas no marketing).
Artur
Felipe Aron wrote:
> Interessante esse tópico, minha dúvida:
> Tenha um IBOQuery que faz uma select. Abro a query, uso o que tenho que usar
> e simplesmente fecho ela (IBOQuery.Close).
> Minha transação está como Read-Commited e o IBDataBase com a propriedade
> AutoCommit = False.
>
> Nesse caso da minha Select com o IBO, a transação continua ativa ???
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use: http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>
>
Mais detalhes sobre a lista de discussão lista