[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