QUAL MELHOR CONEXAO
Olá amigos...
Gostaria de saber qual a posição de vocês sobre a melhor forma de se conectar a um banco de dados firebird 2.1
Hoje uso a DLL ibole.dll, me conectando da seguinte forma:
agora comecei a testar a conexao utilizado ODBC, usando o provedor
que baixei em
http://www.firebirdsql.org/index.php?op=files&id=odbc
utilizando a seguinte striung de conexão:
Em tempo: Comc = nome_do_servidor:Nome_da_base_de_dados EXEMPLO : Comc = 192.168.0.101:c: este\dados\base_de_dados..fdb
Nos primiero momentos de mudança, já notei que algumas coisas são bem diferentes:
- com a Ibole.dll eu podia dar um CommitTrans sem ter iniciado com um BeginTrans
- no caso do ODBC, quando uso a função SUM em uma sql que retorna 0 ou NULL, ele não permite um CLOSE no recordset resultante, apenas o NOTHING
- os codigos de erro capturados atraves de tratamentos utilizando a o Err.Number, são diferentes para os mesmos erros.
bem... como comecei a fazer os testes hoje... com certeza irei encontrar mais uma pá de pepinos.
Mas gostaria de saber a opinião de vocês sobre as duas formas de conexão..
ha!!! ia me esquecendo: uso a ibole.dll a mais de dois anos... porem em bases de dados grandes e com muitas transações via rede eu venho notando perda de performance alem de muita corrupção na base de dados. E antes que alguém (Sr Capella por exemplo) me pergunte: A base de dados foi normatizada (desta vez).
Abraços a Todos...
Ps.: Capelex, foi brincadeirinha viu fiotão? http://www.vbmania.com.br/images/smile/sml12.gif
Gostaria de saber qual a posição de vocês sobre a melhor forma de se conectar a um banco de dados firebird 2.1
Hoje uso a DLL ibole.dll, me conectando da seguinte forma:
Set ConexaoBD = New ADODB.Connection
ConexaoBD.Open [Ô]Provider=IBOLE.PROVIDER;Data Source=[Ô] & Comc, [Ô]SYSDBA[Ô], [Ô]masterkey[Ô]
ConexaoBD.CursorLocation = adUseClient
agora comecei a testar a conexao utilizado ODBC, usando o provedor
Citação:Firebird ODBC/JDBC Drivers
Version 2.0 Release Candidate 1 (RC1)
que baixei em
http://www.firebirdsql.org/index.php?op=files&id=odbc
utilizando a seguinte striung de conexão:
Set ConexaoBD = New ADODB.Connection
ConexaoBD.Open [Ô]DRIVER=Firebird/InterBase(r) driver; UID=SYSDBA; PWD=masterkey; DBNAME=[Ô] & Comc
ConexaoBD.CursorLocation = adUseClient
Em tempo: Comc = nome_do_servidor:Nome_da_base_de_dados EXEMPLO : Comc = 192.168.0.101:c: este\dados\base_de_dados..fdb
Nos primiero momentos de mudança, já notei que algumas coisas são bem diferentes:
- com a Ibole.dll eu podia dar um CommitTrans sem ter iniciado com um BeginTrans
- no caso do ODBC, quando uso a função SUM em uma sql que retorna 0 ou NULL, ele não permite um CLOSE no recordset resultante, apenas o NOTHING
- os codigos de erro capturados atraves de tratamentos utilizando a o Err.Number, são diferentes para os mesmos erros.
bem... como comecei a fazer os testes hoje... com certeza irei encontrar mais uma pá de pepinos.
Mas gostaria de saber a opinião de vocês sobre as duas formas de conexão..
ha!!! ia me esquecendo: uso a ibole.dll a mais de dois anos... porem em bases de dados grandes e com muitas transações via rede eu venho notando perda de performance alem de muita corrupção na base de dados. E antes que alguém (Sr Capella por exemplo) me pergunte: A base de dados foi normatizada (desta vez).
Abraços a Todos...
Ps.: Capelex, foi brincadeirinha viu fiotão? http://www.vbmania.com.br/images/smile/sml12.gif
IBOLE.DLL
acho melhor
menos erros
dá uma ida no meu topico tb e vê se pode me ajudar
http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=354393&varWorld=
acho melhor
menos erros
dá uma ida no meu topico tb e vê se pode me ajudar
http://www.vbmania.com.br/pages/index.php?varModulo=Forum&varMethod=abrir&varID=354393&varWorld=
definitivamente o IBOLE é melhor e mais rapido, sem contar que ODBC vc tem que configurara cada maquina.
com ibole se vc comitar sem de abrir um begin não dá erro mais também não é feito nada só descarregado um processo pendente se houver. outra aqui eu testanto acusou erro. (não é possivel concluir uma operação que não esteja aberta)
a corrupção do banco de dados não tem haver com a dll IBOLLE o que pode ocorrer são
1 - beginstrasn sem comitar ou sem rollback
2 - Tabelas ficando abertas
3 - usuario desligando o servidor com conexões ativas, e esta é a mais comum e também, nunca ninguem vai dizer fui eu.
qdo qualquer uma das ocorrencias acima acontece fica alguma coisa pendente no firebird, que pode bagunçar os indices das tabelas, e qdo um solicitação for feita ao sgbd demore o retorno.
solução
embora eu já tenha te passado vou repetir de novo.
passar o gefix do firebird, em todo fechamento do sistema do servidor( se não tiver o sistema instalado no servidor criei algo que passe o gfix e faça backup automatico. passando antes aqueles comandos de recuperação, não custa nada e se o banco de dados não tiver problemas não vai prejudicar. as vantagens é que todos os indices são organizados e o bco vai responder aos comandos + rapido.
tem um esquema de abertura que indica que qdo aquela conexão for fechada seja encerrada qualquer operação pendente.
uma outra ideia e ter algo que antes de qualquer solicitação ao bco verifique se a rede está ativa.
outra abrir a conexão qdo abrir uma tela e fechar a conexão ao fechar a tela.
na tela de venda que geralmente costuma ficar sempre ativo, abrir ao iniciar uma venda e fechar ao finalizar a venda, estilo vbnet onde é comum este procedimento.
com isso os riscos de corrupção serão reduzidos.
outra ao criar indices, criei um indice separado para cada campo, e não varios indices juntos
aconselhe ao administrador a fazer uma desfragmentação do computador regularmente.
é isso medadas paleativas que podem ajudar.
com ibole se vc comitar sem de abrir um begin não dá erro mais também não é feito nada só descarregado um processo pendente se houver. outra aqui eu testanto acusou erro. (não é possivel concluir uma operação que não esteja aberta)
a corrupção do banco de dados não tem haver com a dll IBOLLE o que pode ocorrer são
1 - beginstrasn sem comitar ou sem rollback
2 - Tabelas ficando abertas
3 - usuario desligando o servidor com conexões ativas, e esta é a mais comum e também, nunca ninguem vai dizer fui eu.
qdo qualquer uma das ocorrencias acima acontece fica alguma coisa pendente no firebird, que pode bagunçar os indices das tabelas, e qdo um solicitação for feita ao sgbd demore o retorno.
solução
embora eu já tenha te passado vou repetir de novo.
passar o gefix do firebird, em todo fechamento do sistema do servidor( se não tiver o sistema instalado no servidor criei algo que passe o gfix e faça backup automatico. passando antes aqueles comandos de recuperação, não custa nada e se o banco de dados não tiver problemas não vai prejudicar. as vantagens é que todos os indices são organizados e o bco vai responder aos comandos + rapido.
tem um esquema de abertura que indica que qdo aquela conexão for fechada seja encerrada qualquer operação pendente.
uma outra ideia e ter algo que antes de qualquer solicitação ao bco verifique se a rede está ativa.
outra abrir a conexão qdo abrir uma tela e fechar a conexão ao fechar a tela.
na tela de venda que geralmente costuma ficar sempre ativo, abrir ao iniciar uma venda e fechar ao finalizar a venda, estilo vbnet onde é comum este procedimento.
com isso os riscos de corrupção serão reduzidos.
outra ao criar indices, criei um indice separado para cada campo, e não varios indices juntos
aconselhe ao administrador a fazer uma desfragmentação do computador regularmente.
é isso medadas paleativas que podem ajudar.
Só usaria o IBOLE ou o SIB para o FB 1.5. O SIB nem a fbclient.dll usa, usa a GDS32.dll que é do Interbase, já o IBOLE eu não sei se ele usa a fbclient.dll. Usaria o FB 2.x com essas dlls se houvessem versões mais atuais delas, então acredito que ODBC seja a melhor opção.
ARNALDOCRUZ:
Todos os dias pela manhã, os clientes efetuam backup (se não o fixerem o sistema fica enchendo o saco a cada 20 minutos avisando que não foi feito o backlup do dia)
neste rotina de backup, eu faço uma copia fisica, passo o gfix, faço o gbak, restauro o gbak, passo o gfix de novo e compacto tudo. veja o .bat abaixo:
Gostaria de saber como funciona e qual a sintaxe deste esquema.
como no meu sistema tem um modulo de mensagens e lembretes instataneos que a cada 10 segundos ele vai no bd e vê se tem alguma mansagem ou compromisso para o usuario logado, neste momento ele já checa se o bd ta aberto e se nao tiver fecha o sistema.
essa eu naõ entendi... eu abro o bd na entrada do sistema... em uma variavel publica que fica aberta até a saida do sistema.... se a cada form eu abrir a conexao e depois fechar... vai perder muito em performance... não entedi bem o que vc quis dizer... não posso ter uma conexao aberta o tempo inteiro??? e abrir e fechar apenas os recordsets que vou usar a cada momento? eu abro um record set, pego o que quero (ou gravo) e fecho esse record set imediatamente.... me explica melhor por favor...
Obrigado amigo...
Citação:passar o gefix do firebird, em todo fechamento do sistema do servidor( se não tiver o sistema instalado no servidor criei algo que passe o gfix e faça backup automatico. passando antes aqueles comandos de recuperação, não custa nada e se o banco de dados não tiver problemas não vai prejudicar. as vantagens é que todos os indices são organizados e o bco vai responder aos comandos + rapido.
Todos os dias pela manhã, os clientes efetuam backup (se não o fixerem o sistema fica enchendo o saco a cada 20 minutos avisando que não foi feito o backlup do dia)
neste rotina de backup, eu faço uma copia fisica, passo o gfix, faço o gbak, restauro o gbak, passo o gfix de novo e compacto tudo. veja o .bat abaixo:
copy Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.BAK /Y
c:\ARQUIV~1\firebird\FIREBI~1\bin\gfix -mend -full -ignore Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB
c:\ARQUIV~1\firebird\FIREBI~1\bin\gbak -backup -v -ignore -garbage -limbo Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.GBK
c:\ARQUIV~1\firebird\FIREBI~1\bin\gbak -create -v -rep -inactive -one_at_a_time Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.GBK Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB
c:\ARQUIV~1\firebird\FIREBI~1\bin\gfix -mend -full -ignore Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB
c:\ARQUIV~1\firebird\FIREBI~1\bin\gfix Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.FDB -commit all
del Z:\du\DOWNUP~1\dados\COMERCIAL_FIRE_USIEMAN.GBK /S
del c:\du\CPIA~1\071010.RAR /S
Z:\Sistemas\Down_Ups\Fontes\COMERC~4ar.exe a c:\du\CPIA~1\071010.RAR Z:\du\DOWNUP~1\*.* -r
Citação:tem um esquema de abertura que indica que qdo aquela conexão for fechada seja encerrada qualquer operação pendente.
Gostaria de saber como funciona e qual a sintaxe deste esquema.
Citação:uma outra ideia e ter algo que antes de qualquer solicitação ao bco verifique se a rede está ativa.
como no meu sistema tem um modulo de mensagens e lembretes instataneos que a cada 10 segundos ele vai no bd e vê se tem alguma mansagem ou compromisso para o usuario logado, neste momento ele já checa se o bd ta aberto e se nao tiver fecha o sistema.
Citação:outra abrir a conexão qdo abrir uma tela e fechar a conexão ao fechar a tela.
essa eu naõ entendi... eu abro o bd na entrada do sistema... em uma variavel publica que fica aberta até a saida do sistema.... se a cada form eu abrir a conexao e depois fechar... vai perder muito em performance... não entedi bem o que vc quis dizer... não posso ter uma conexao aberta o tempo inteiro??? e abrir e fechar apenas os recordsets que vou usar a cada momento? eu abro um record set, pego o que quero (ou gravo) e fecho esse record set imediatamente.... me explica melhor por favor...
Obrigado amigo...
1 caso vc passa o gfix e gbak e tudo fica na copia do backup, para que seja feito no banco atual vc tem que fazer uma restauração.
Backup tem que ser ao sair do sistema e não ao entrar
2 - caso não encontrei material sobre isso, só li comentários do site do firebird
3 caso monitromanteo de rede de 10 em 10 minutos é mesma coisa que nada, o ideal é vc ter na pasta do servidor um arquivo qualquer, txt,dll etc. que a cada solicitação ao bd seja feita a existencia desse arquivo.
quando um computador é aberto eu identifico se este é cliente ou servidor pois tenho sistema funcionando como cliente/servidor e também só cliente.
eu fiz o seguinte. na tela principal coloquei um label
quando o sistema é aberto eu coloco ele como [Ô]sistema conectado[Ô]
coloqui um timer que fica verificando a existencia de uma arquivo Rede.txt
dim caminho as String
caminho=Dir([Ô]\\Servidor\Pastaede.txt[Ô])
if caminho=[Ô][Ô] or isnull(caminho) then
label.caption=[Ô]Sistema descontectado[Ô]
else
label.caption=[Ô]Sistema Conectado[Ô]
endif
antes da solicitação ao Banco de dados
if FrmPrincipal.Label1.caption=[Ô]Sistema desconectado[Ô] then
dou uma mensagem pro usuario pra ele verificar cabo,servidor desligado etc.......
exit sub
endif
4 caso abrir e fechar conexão, pelo contrario deixa o computador mais rapido, pois diminue o trafego de informações em rede
a cada 10 segundos vai ao BD se houver qualquer queda da conexão pronto já ocorreu um erro, se vc verificar um arquivo qualquer não acontecerá o erro.
e não adianta dizer que trata o erro, pois se a rede está disconectada e o cursor cai em um select o tempo de resposta do erro da a impressão que o sistema travou sem contar que as vezes trava mesmo até com o tratamento de erros.
conectar e desconectar
a conexão é quase que instântanea vc não percebe nada de diferente, se perceber é porque algo está errado.
porque a corrupção acontece ? porque o sistema servidor seja lá por qualquer motivo é danificada ? por que tinha um,dois ou mais computadores conectados ao bando de dados, como ela foi interrompida abruptamente acontece a corrupção do Bco que vai ficar com duas conexões pendentes, estilo operações não comitadas.
como evitar ou diminuir a possibilidade.
como faço sei que paleativo, mas testei dll e dlls que prometia identificar a rede só que hora ou outra respondia errado, tipo a conexão tá boa e responde que está ruim, ou está ruim e responde que esta boa.
fiz como abaixo e é super funcional até então quase 8 meses nunca tive problemas, sempre que a rede cai a identificação é imediata e ao ser restabelecida a rede a conexão é automatica.
abrir um form faço a conexão, fechei o form fechei a conexão.
se tiver um tela que sempre fique aberta tipo tela de venda.
inicio um venda abre a conexão, concluiu a venda fecha a conexão.
se acontecer qualquer coisa com o servidor ou cabo ou seja lá o que for, o banco de dados está sem conexões ativa e não vai ter problemas.
eu também pensei que nesse esquema perderia perfomance + já nos teste percebi que melhorava até, pois minhas consultas, gravação começaram a responder + rapido e porque ? porque naquele exato momento tinha um pequena qtde de máquinas conectadas, e o bd aplica todo o recurso apenas na minha conexão. portanto quanto maior o numéro de conexão os recursos são divididos
Backup tem que ser ao sair do sistema e não ao entrar
2 - caso não encontrei material sobre isso, só li comentários do site do firebird
3 caso monitromanteo de rede de 10 em 10 minutos é mesma coisa que nada, o ideal é vc ter na pasta do servidor um arquivo qualquer, txt,dll etc. que a cada solicitação ao bd seja feita a existencia desse arquivo.
quando um computador é aberto eu identifico se este é cliente ou servidor pois tenho sistema funcionando como cliente/servidor e também só cliente.
eu fiz o seguinte. na tela principal coloquei um label
quando o sistema é aberto eu coloco ele como [Ô]sistema conectado[Ô]
coloqui um timer que fica verificando a existencia de uma arquivo Rede.txt
dim caminho as String
caminho=Dir([Ô]\\Servidor\Pastaede.txt[Ô])
if caminho=[Ô][Ô] or isnull(caminho) then
label.caption=[Ô]Sistema descontectado[Ô]
else
label.caption=[Ô]Sistema Conectado[Ô]
endif
antes da solicitação ao Banco de dados
if FrmPrincipal.Label1.caption=[Ô]Sistema desconectado[Ô] then
dou uma mensagem pro usuario pra ele verificar cabo,servidor desligado etc.......
exit sub
endif
4 caso abrir e fechar conexão, pelo contrario deixa o computador mais rapido, pois diminue o trafego de informações em rede
a cada 10 segundos vai ao BD se houver qualquer queda da conexão pronto já ocorreu um erro, se vc verificar um arquivo qualquer não acontecerá o erro.
e não adianta dizer que trata o erro, pois se a rede está disconectada e o cursor cai em um select o tempo de resposta do erro da a impressão que o sistema travou sem contar que as vezes trava mesmo até com o tratamento de erros.
conectar e desconectar
a conexão é quase que instântanea vc não percebe nada de diferente, se perceber é porque algo está errado.
porque a corrupção acontece ? porque o sistema servidor seja lá por qualquer motivo é danificada ? por que tinha um,dois ou mais computadores conectados ao bando de dados, como ela foi interrompida abruptamente acontece a corrupção do Bco que vai ficar com duas conexões pendentes, estilo operações não comitadas.
como evitar ou diminuir a possibilidade.
como faço sei que paleativo, mas testei dll e dlls que prometia identificar a rede só que hora ou outra respondia errado, tipo a conexão tá boa e responde que está ruim, ou está ruim e responde que esta boa.
fiz como abaixo e é super funcional até então quase 8 meses nunca tive problemas, sempre que a rede cai a identificação é imediata e ao ser restabelecida a rede a conexão é automatica.
abrir um form faço a conexão, fechei o form fechei a conexão.
se tiver um tela que sempre fique aberta tipo tela de venda.
inicio um venda abre a conexão, concluiu a venda fecha a conexão.
se acontecer qualquer coisa com o servidor ou cabo ou seja lá o que for, o banco de dados está sem conexões ativa e não vai ter problemas.
eu também pensei que nesse esquema perderia perfomance + já nos teste percebi que melhorava até, pois minhas consultas, gravação começaram a responder + rapido e porque ? porque naquele exato momento tinha um pequena qtde de máquinas conectadas, e o bd aplica todo o recurso apenas na minha conexão. portanto quanto maior o numéro de conexão os recursos são divididos
Tópico encerrado , respostas não são mais permitidas