Fórum Qual o melhor sistema para rodar o servidor do Firebird? #371629
25/06/2009
0
Tenho uma aplicação em Delphi + Firebird 2.0 e em vários momentos de pesquisa, a aplicação fica congelada esperando o retorno de um select no banco de dados. Hoje o Firebird está rodando em uma máquina com Windows 2003 Server + P4 3.0Ghz + 1GB Ram. ´Tenho mais ou menos 15 usuários usando simultaneamente. O qie vcs acham? Melhoroa máquina? Troco de S.O? Talvez Linux? Qual versão?
Abraço
Seu_madruga
Curtir tópico
+ 0Posts
26/06/2009
Discorpio
Tudo depende qual foi a lógica que voce desenvolveu na sua aplicação.
Muitas pessoas acham que quando desenvolve uma aplicação que no ínicio era rápida e depois se torna lenta, o problema é do Sistema Operacional, quando na verdade o erro está nos detalhes de programação da aplicação.
Mas que detalhes são estes :?:
Por exemplo, esses 15 usuários, quando abre uma tabela, eles carregam o DataSet local com todos os registros da Tabela :?: Quando voce abre uma instância de sua aplicação na máquina cliente, essa instância quando abre uma tabela, ela carrega local no cache de HD da máquina cliente os registros da tabela com o nome de DataSet (Conjunto de Dados), onde o cliente manipula e atualiza esse DataSet Local, que depois é enviado de volta ao banco atráves de um Commit. Só que ele envia o DataSet inteiro que carregou, imagine se essa tabela contém nada mais e nada menos que 987.457 registros. Multiplica isso por 15 usuários e veja se até mesmo o melhor sistema operacional, o melhor banco de dados e o melhor aplicativo tem condições de bancar.
A melhor forma de desenvolver uma aplicação para redes é que inicialmente ao instanciar o aplicativo na máquina cliente, ele não abra tabela nenhuma, e quando o usuário necessitar de uma informação, para ele só vai interessar aquela informação de apenas um único registro, ou se for vários, serão poucos registros estabelecidos por um critério de pesquisa. Agora eu te pergunto, para que o cliente vai querer ler os dados de uma tabela inteira :?: Principalmente se ela contiver os números de registros que citei acima, haja saco :shock: :roll:
Não sei se sua aplicação esteja configurada desse jeito, apenas estou presupondo que seja esse o problema, por isso eu recomendo que voce dê uma olhada na lógica de sua aplicação. Pois, para chegar a esse conhecimento, tive que cometer os mesmos erros e passar por essa experiência.
Gostei + 0
26/06/2009
Seu_madruga
Primeiramente obrigado pelas dicas, serão de grande ajuda.
Bom, sobre seus comentários, alguns deles eu conheço, outros realmente podem estar sendo um tiro na culatra. Antes de mais nada, minha aplicação utiliza DBXpress. Para cada conexão de tabelas, utilizo os seguintes componentes:
SQLDataSet -> DataSetProvider -> ClientDataSet
Então como vc me falou, toda pesquisa feita, a aplicação envia a requisitão, o servidor devolve e esses registros ficam no cache do CDS.
Quando minha aplicação é iniciada, todas as tabelas iniciam fechadas. Agora a aplicação ´trava´ geralmente quando se faz uma pesquisa no banco de dados, outras raras vezes é quando se está fazendo um procedimento que insere ou edita muitas tabelas ao mesmo tempo.
A aplicação congela não por algum problema no código e sim porque ela fica esperando e resposta do servidor e enquanto não responde, a aplicação fica congelada.
Voce falou uma coisa que eu não sabia, quando vc pesquisa 200 registros e altera um apenas, esse dataset é enviado para o servidor não com 1 registro editado mas sim todo o dataset. É isso mesmo? Como resolvo isso, sendo que isso é uma rotina do componente?
Gostei + 0
26/06/2009
Discorpio
Primeiramente quero te pedir perdão por um erro meu que postei aqui, com relação a atualizar o DataSet inteiro.
Ao fazer uma pesquisa mais acurada verifiquei que o DataSetProvider não realiza atualização do DataSet inteiro, e sim quando o método ApplyUpdates do ClientDataSet é invocado, ele cria um outro pacote chamado de Delta somente com os registros que foram atualizados e os envia ao DataSetProvider, que se encarregará de realizar os comandos SQL necessários (Insert, Delete ou Update). Confirmei isto ao verificar tanto no Livro Delphi 7 - A Bíblia, quanto no site abaixo:
https://www.devmedia.com.br/articles/viewcomp.asp?comp=1186
Agora gostaria de te fazer uma pergunta, estas atualizações e pesquisa, voce utiliza qual componente, o SQLDataSet ou ClientDataSet :?:
Gostei + 0
26/06/2009
Weber
Gostei + 0
27/06/2009
Discorpio
Existe também uma possibilidade que esqueci de mencionar :idea:
Como o nosso amigo está usando Windows 2003 Server, possa ser que o Firewall do Windows esteja bloqueando alguns recursos. O Interbase e o Firebird utilizam as portas 3050 e 3052. Não custa liberar uma dessas portas para o Firebird
Gostei + 0
29/06/2009
Seu_madruga
Utilizo clientDatraSet direto para tudo que faço, seja Selects, Updates e exclusões com o sem SQL.
Gostei + 0
29/06/2009
Seu_madruga
Ola,
quais eventos vc se refere? Stored Procedures? Triggers?
Gostei + 0
29/06/2009
Crash
Configure no ClientDataSet a propriedade PackedRecords = 10 no máximo... evite usar Indices de Memória. O uso de ClientDataSet em bases muito grandes, ou com muitos acessos sumultaneos causa bastante lentidão. Técnicas de programação de Desktop usadas em ambiente Client/Server também causam lentidão.
Exemplo:
ERRADO
Ao iniciar o forumlário ou aplicação, abrir todas as tabelas com todos registros.
CERTO
Abrir formulário com a tabela fechada, e exigir que o cliente faça um filtro antes, diminuindo os dados trafegados pela rede.
Outra coisa que pode influenciar são os JOINS. Joins complexos podem causar lentidão. Tente criar indices para os campos que vc usa para Joins, execute todas as joins em uma ferramenta para testar a velocidade da execução. Algumas vezes vc vai ter que elaborar o plano para o Firebird usar os indices certos. E caso nada resolva, crie Views. Views agilizam muito o processamento de queries porque ele mantem os resultados em cache.
t+
Gostei + 0
29/06/2009
Seu_madruga
Vou testar usar o PackedRecords pra ver se melhora.
Sobre as Selects, sempre que desenvolvo uma, eu testo no ibExpert para ver se ela demora a ser rodada, para depois implementar no sistema. Todas estão muito rapidas então não sei se os congeamentos no sistema são por causa das selects. Ainda acho que está dando algum congestionamento na rede quando varias pessosas requisitam selects ao mesmo tempo. Então não sei como resolver isso, se mexo na maquina servidora, ou tentar desenvolver uma espécie de ´Cancelar´ durante a pesquisa, pois quando a aplicação congela, na verdade ela esta´esperando a resposta do servidor, e isso faz com que o usuario pense que a aplicação travou, forçando-o a derraba-la pelo CTRL + ALT + DEL.
Pelo que vi, esse congelamento de aplicação é comum toda vez que se faz uma Select correto? Como voces resolveram isso?
Gostei + 0
01/07/2009
Pestana_
Você verificou o Firewall como o nosso amigo Discorpio citou?
você esta utilizando Stored Procedure para os seus selects? sera que este servidor esta sofrendo de sobrecarga?
Concordo, verifique isso Seu_madruga.
Gostei + 0
01/07/2009
Danielrsanches
olá Seu_madruga !!
quanto a dúvia acima mencionada, pq vc não faz um teste ?? (se é que vc ainda não fez, e se fez, post aki o resultado)
tente fazer consultas em apenas 1 máquina cliente... se o sistema estiver rodando rápido, 100¬, vá aumentando a quantidade de máquinas fazendo consultas, até tentar chegar em um limite onde o sistema fique lento ...
outra sugestão, é verificar se não existe nenhuma máquina CLIENTE que esteja muito ultrapassada, com uma placa de rede muito fraca, causando assim tbm, um congestionamento na rede .. as vezes nos concentramos no servidor e esquecemos das máquinas clientes ...
abraços !!!
Gostei + 0
01/07/2009
Pestana_
por ex.: você tem uma tabela com 20 campos e altera o campoX do registro, então neste caso o DataSetProvider se encarrega de montar o Update desta forma:
update Tabela
set campoX = ´xxxx´
where codigo = 99999
observe que o dataSetProvider montou atualização de somente o campo que sofreu atualização e não de todos os campo da tabela (lógico a menos que todos os campo sofrerem alteração).
bom eu não estou afirmando nada, já que eu não tenho muito conhecimento sobre DBExpress. Se eu estive errado por favor alguem me corrija!
boa sorte!
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)