Fórum Qual o melhor sistema para rodar o servidor do Firebird? #371629

25/06/2009

0

Fala pessoal

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

Seu_madruga

Responder

Posts

26/06/2009

Discorpio

Boa noite Seu_madruga.

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.


Responder

Gostei + 0

26/06/2009

Seu_madruga

Bom dia Discorpio,

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?


Responder

Gostei + 0

26/06/2009

Discorpio

Bom dia Seu_madruga.

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 :?:


Responder

Gostei + 0

26/06/2009

Weber

Você está usando eventos no firebird?


Responder

Gostei + 0

27/06/2009

Discorpio

Bom dia a todos.

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


Responder

Gostei + 0

29/06/2009

Seu_madruga

Bom dia Seu_madruga. 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 :?:


Utilizo clientDatraSet direto para tudo que faço, seja Selects, Updates e exclusões com o sem SQL.


Responder

Gostei + 0

29/06/2009

Seu_madruga

Você está usando eventos no firebird?


Ola,

quais eventos vc se refere? Stored Procedures? Triggers?


Responder

Gostei + 0

29/06/2009

Crash

O uso indiscriminado do ClientDataSet que está causando a lentidão.

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+


Responder

Gostei + 0

29/06/2009

Seu_madruga

Ola,

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?


Responder

Gostei + 0

01/07/2009

Pestana_

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

Você verificou o Firewall como o nosso amigo Discorpio citou?

Ainda acho que está dando algum congestionamento na rede quando varias pessosas requisitam selects ao mesmo tempo.


você esta utilizando Stored Procedure para os seus selects? sera que este servidor esta sofrendo de sobrecarga?

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.


Concordo, verifique isso Seu_madruga.


Responder

Gostei + 0

01/07/2009

Danielrsanches

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.


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 !!!


Responder

Gostei + 0

01/07/2009

Pestana_

Seu_madruga, eu não utilizo componentes DBExpress, mas se eu não me engano é possível enviar para o servidor somentes os campos que realmente sofreram alterações, basta alterar algumas configurações do DataSetProvider parar que isto seja permitido.

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!


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar