IBO - Como obter o máximo de Performance?
Olá Pessoal
Tenho uma aplicação onde trabalho com IBO x Firebird x Delphi 7
Utilizo o componente da Paleta IBOCore para acesso a base de dados:
TIB_Connection e TIB_Transaction.
Uso também os componentes TIB_Query e TIB_Datasource para acessar as
tabelas.
As perguntas são:
1->Como configurar as propriedades destes componentes para obter o
máximo de performance?
2->Quando utilizar o TIB_Cursor?
3->Qual a forma correta de abrir a conexão. Hoje eu utilizo a seguinte
forma dentro do Evento FormActivate.
if not dm.conexao.connected then
dm.conexao.connected :=true;
if not dm.qryclientes.active then
dm.qryclientes.active := true;
3.1->É aconselhável testar a conexão a cada form?
3.2->É preciso abrir/fechar as query´s a cada form, ou posso
deixá-las aberta até a saida do sistema?
3.3->Estas informações ( da query ) ficam em cache ou o há um
ponteiro aberto no banco dados?
3.4->Em qual evento é melhor fazer a abertura da query.
4->É possível trabalhar multi-camadas com IBO?
5->Qual a performance do IBO no acesso a uma base de dados remota (
internet )?
6->Como arrastar os campos para um form atrases do TIB_Datasource sendo
que este está em um Datamodule.
7->Qual exemplo de select usar? e porque?
7.1
SELECT E.CODCLI
, E.RAZAO
, E.CODMUNCOM
, A.DESCMUN
FROM CLIENTES E
LEFT JOIN MUNICIPIO A ON (A.CODMUN = E.CODMUNCOM)
7.2
SELECT E.CODCLI
, E.RAZAO
, E.CODMUNCOM
, (SELECT DESCMUN FROM MUNICIPIO WHERE CODMUN =
E.CODMUNCOM) AS DESCMUN
FROM CLIENTES E
8->Há alguma configuração adicional para rodar o firebird em uma máquina
com Windows 2003 Server? Achei que ficou mais lento, uma vez que o
servidor firebird estava instalado numa máquina com o XP SP2.
-----------------
Desculpem a quantidade de perguntas, mas é porque não estou conseguindo
fazer com minha aplicação rode satisfatoriamente, já que há momentos que
o programa não consegue abrir uma tabela com apenas 10.000, acessando
diretamente no servidor.
Reuber Abdias de Moura Junior.
Tenho uma aplicação onde trabalho com IBO x Firebird x Delphi 7
Utilizo o componente da Paleta IBOCore para acesso a base de dados:
TIB_Connection e TIB_Transaction.
Uso também os componentes TIB_Query e TIB_Datasource para acessar as
tabelas.
As perguntas são:
1->Como configurar as propriedades destes componentes para obter o
máximo de performance?
2->Quando utilizar o TIB_Cursor?
3->Qual a forma correta de abrir a conexão. Hoje eu utilizo a seguinte
forma dentro do Evento FormActivate.
if not dm.conexao.connected then
dm.conexao.connected :=true;
if not dm.qryclientes.active then
dm.qryclientes.active := true;
3.1->É aconselhável testar a conexão a cada form?
3.2->É preciso abrir/fechar as query´s a cada form, ou posso
deixá-las aberta até a saida do sistema?
3.3->Estas informações ( da query ) ficam em cache ou o há um
ponteiro aberto no banco dados?
3.4->Em qual evento é melhor fazer a abertura da query.
4->É possível trabalhar multi-camadas com IBO?
5->Qual a performance do IBO no acesso a uma base de dados remota (
internet )?
6->Como arrastar os campos para um form atrases do TIB_Datasource sendo
que este está em um Datamodule.
7->Qual exemplo de select usar? e porque?
7.1
SELECT E.CODCLI
, E.RAZAO
, E.CODMUNCOM
, A.DESCMUN
FROM CLIENTES E
LEFT JOIN MUNICIPIO A ON (A.CODMUN = E.CODMUNCOM)
7.2
SELECT E.CODCLI
, E.RAZAO
, E.CODMUNCOM
, (SELECT DESCMUN FROM MUNICIPIO WHERE CODMUN =
E.CODMUNCOM) AS DESCMUN
FROM CLIENTES E
8->Há alguma configuração adicional para rodar o firebird em uma máquina
com Windows 2003 Server? Achei que ficou mais lento, uma vez que o
servidor firebird estava instalado numa máquina com o XP SP2.
-----------------
Desculpem a quantidade de perguntas, mas é porque não estou conseguindo
fazer com minha aplicação rode satisfatoriamente, já que há momentos que
o programa não consegue abrir uma tabela com apenas 10.000, acessando
diretamente no servidor.
Reuber Abdias de Moura Junior.
Jubrovolski
Curtidas 0
Respostas
Silviogs
12/03/2005
Olá amigo
estou utilizando agora o 2005 com ZeosLib e FireBird, para min utilizar o zeos foi o que mais satisfatório dos componentes, além de ser free fornece acesso a outros tipos de banco. vai um emxemplo de conexão que desenvolvi.
crie um arq. ini dessa forma com o mesmo nome do exe.
EX: sistema.exe ---> sistema.ini
[SYSCONFIG]
DIRETORIO_RELATORIOS=
HOSTNAME=
DATABASE=D:\SISTEMAS\CARTORIO\DADOS\CARTORIOFB.GDB
USER=SYSDBA
PASSWORD=masterkey
PROTOCOL=firebird-1.5
CONFIGURACAO=
TELAFUNDO=TelaFundo.JPG
TELAPRINCIPAL=telapadrao.JPG
OPCAOMENSXP=0
crie uma unit com estas funções
procedure TSysConfig.CarregaArquivoIni;
var
Arq: TIniFile;
ListaAtributos: TStrings;
NovoNome: string;
i: Integer;
begin
ListaAtributos := TStringList.Create;
NovoNome := Copy(Application.ExeName, 1, Pos(´.EXE´, UpperCase(Application.ExeName)) - 1) + ´.ini´;
if not FileExists(NovoNome) then
ShowMessage(Format(´Arquivo ´¬s´ não foi localizado!´,[NovoNome]));
Arq := TIniFile.Create(NovoNome);
SysConfig := TSysConfig.Create;
Arq.ReadSectionValues(´SYSCONFIG´, ListaAtributos);
SysConfig.DIRETORIO_RELATORIOS := Arq.ReadString(´SYSCONFIG´,´DIRETORIO_RELATORIOS´,´´);
SysConfig.HOSTNAME := Arq.ReadString(´SYSCONFIG´,´HOSTNAME´,´´);
SysConfig.DATABASE := Arq.ReadString(´SYSCONFIG´,´DATABASE´,´´);
SysConfig.USER := Arq.ReadString(´SYSCONFIG´,´USER´,´´);
SysConfig.PASSWORD := Arq.ReadString(´SYSCONFIG´,´PASSWORD´,´´);
SysConfig.PROTOCOL := Arq.ReadString(´SYSCONFIG´,´PROTOCOL´,´´);
SysConfig.TELAFUNDO := Arq.ReadString(´SYSCONFIG´,´TELAFUNDO´,´´);
SysConfig.TELAPRINCIPAL := Arq.ReadString(´SYSCONFIG´,´TELAPRINCIPAL´,´´);
SysConfig.OPCAOMENSXP := Arq.ReadInteger(´SYSCONFIG´,´OPCAOMENSXP´,0);
Arq.Free;
ListaAtributos.Free;
end;
procedure TSysConfig.AbirConexao(Conexao: TZConnection; Config: TZQuery);
begin
Conexao.Connected := false;
Conexao.Database := SysConfig.DATABASE;
Conexao.HostName := SysConfig.HOSTNAME;
Conexao.User := SysConfig.USER;
Conexao.Password := SysConfig.PASSWORD;
Conexao.Protocol := Sysconfig.PROTOCOL;
Conexao.Connected := true;
AbrirQuery(Config, False);
Config.First;
// Sysconfig.COR_TEXTO_MENU := ADOQrySysConfig.FieldValues[´COR_TEXTO_MENU´].AsString;
// Sysconfig.COR_TEXTO_MODELO_NAV := ADOQrySysConfig.FieldValues[´COR_TEXTO_MODELO_NAV´].AsString;
FecharQuery(Config);
end;
procedure TSysConfig.FecharConexao(Conexao: TZConnection);
begin
Conexao.Connected := false;
end;
procedure AbrirQuery(Query : TZQuery; ForceReopen : Boolean);
begin
Query.Active := true;
if (Query.State <> dsInactive) and (ForceReopen) then
Query.Close;
if Query.State = dsInactive then
Query.Open;
end;
procedure FecharQuery(Query: TZQuery);
begin
if (Query.State <> dsInactive) then
Query.Close;
end;
no source do projeto inclua:
Application.Initialize;
SysConfig.CarregaArquivoIni; <<------aqui
Application.CreateForm(TFmMain, FmMain);
Application.CreateForm(TDM, DM);
SysConfig.AbirConexao(DM.Conexao,DM.QrySysConfig); <<----aqui
Application.CreateForm(TFLogon, FLogon);
FLogon.DSOperadorAcesso.DataSet := DM.QryOperador;
FLogOn.i := 1;
repeat
FLogon.ShowModal
until not FLogon.Ok;
if (Flogon.i = 4 ) or FLogon.Ok then
Application.Terminate;
Application.Run;
estas foram desenvolvidas para funcionar com qualquer base de dados que o zeos suporte.
caso queira usar MSQSL fica assim:
[SYSCONFIG]
DIRETORIO_RELATORIOS=
HOSTNAME=SERVIDOR
DATABASE=CLIENTES
USER=SA
PASSWORD=
PROTOCOL=mssql
CONFIGURACAO=
TELAFUNDO=TelaFundo.JPG
TELAPRINCIPAL=telapadrao.JPG
OPCAOMENSXP=0
Quando for abrir a tabelas faça no evento OnCreate do form:
AbrirQuery(QueryClientes,false);
para fechar:
FecharQuery(QueryClientes);
Um abraço
Silvio Guedes
estou utilizando agora o 2005 com ZeosLib e FireBird, para min utilizar o zeos foi o que mais satisfatório dos componentes, além de ser free fornece acesso a outros tipos de banco. vai um emxemplo de conexão que desenvolvi.
crie um arq. ini dessa forma com o mesmo nome do exe.
EX: sistema.exe ---> sistema.ini
[SYSCONFIG]
DIRETORIO_RELATORIOS=
HOSTNAME=
DATABASE=D:\SISTEMAS\CARTORIO\DADOS\CARTORIOFB.GDB
USER=SYSDBA
PASSWORD=masterkey
PROTOCOL=firebird-1.5
CONFIGURACAO=
TELAFUNDO=TelaFundo.JPG
TELAPRINCIPAL=telapadrao.JPG
OPCAOMENSXP=0
crie uma unit com estas funções
procedure TSysConfig.CarregaArquivoIni;
var
Arq: TIniFile;
ListaAtributos: TStrings;
NovoNome: string;
i: Integer;
begin
ListaAtributos := TStringList.Create;
NovoNome := Copy(Application.ExeName, 1, Pos(´.EXE´, UpperCase(Application.ExeName)) - 1) + ´.ini´;
if not FileExists(NovoNome) then
ShowMessage(Format(´Arquivo ´¬s´ não foi localizado!´,[NovoNome]));
Arq := TIniFile.Create(NovoNome);
SysConfig := TSysConfig.Create;
Arq.ReadSectionValues(´SYSCONFIG´, ListaAtributos);
SysConfig.DIRETORIO_RELATORIOS := Arq.ReadString(´SYSCONFIG´,´DIRETORIO_RELATORIOS´,´´);
SysConfig.HOSTNAME := Arq.ReadString(´SYSCONFIG´,´HOSTNAME´,´´);
SysConfig.DATABASE := Arq.ReadString(´SYSCONFIG´,´DATABASE´,´´);
SysConfig.USER := Arq.ReadString(´SYSCONFIG´,´USER´,´´);
SysConfig.PASSWORD := Arq.ReadString(´SYSCONFIG´,´PASSWORD´,´´);
SysConfig.PROTOCOL := Arq.ReadString(´SYSCONFIG´,´PROTOCOL´,´´);
SysConfig.TELAFUNDO := Arq.ReadString(´SYSCONFIG´,´TELAFUNDO´,´´);
SysConfig.TELAPRINCIPAL := Arq.ReadString(´SYSCONFIG´,´TELAPRINCIPAL´,´´);
SysConfig.OPCAOMENSXP := Arq.ReadInteger(´SYSCONFIG´,´OPCAOMENSXP´,0);
Arq.Free;
ListaAtributos.Free;
end;
procedure TSysConfig.AbirConexao(Conexao: TZConnection; Config: TZQuery);
begin
Conexao.Connected := false;
Conexao.Database := SysConfig.DATABASE;
Conexao.HostName := SysConfig.HOSTNAME;
Conexao.User := SysConfig.USER;
Conexao.Password := SysConfig.PASSWORD;
Conexao.Protocol := Sysconfig.PROTOCOL;
Conexao.Connected := true;
AbrirQuery(Config, False);
Config.First;
// Sysconfig.COR_TEXTO_MENU := ADOQrySysConfig.FieldValues[´COR_TEXTO_MENU´].AsString;
// Sysconfig.COR_TEXTO_MODELO_NAV := ADOQrySysConfig.FieldValues[´COR_TEXTO_MODELO_NAV´].AsString;
FecharQuery(Config);
end;
procedure TSysConfig.FecharConexao(Conexao: TZConnection);
begin
Conexao.Connected := false;
end;
procedure AbrirQuery(Query : TZQuery; ForceReopen : Boolean);
begin
Query.Active := true;
if (Query.State <> dsInactive) and (ForceReopen) then
Query.Close;
if Query.State = dsInactive then
Query.Open;
end;
procedure FecharQuery(Query: TZQuery);
begin
if (Query.State <> dsInactive) then
Query.Close;
end;
no source do projeto inclua:
Application.Initialize;
SysConfig.CarregaArquivoIni; <<------aqui
Application.CreateForm(TFmMain, FmMain);
Application.CreateForm(TDM, DM);
SysConfig.AbirConexao(DM.Conexao,DM.QrySysConfig); <<----aqui
Application.CreateForm(TFLogon, FLogon);
FLogon.DSOperadorAcesso.DataSet := DM.QryOperador;
FLogOn.i := 1;
repeat
FLogon.ShowModal
until not FLogon.Ok;
if (Flogon.i = 4 ) or FLogon.Ok then
Application.Terminate;
Application.Run;
estas foram desenvolvidas para funcionar com qualquer base de dados que o zeos suporte.
caso queira usar MSQSL fica assim:
[SYSCONFIG]
DIRETORIO_RELATORIOS=
HOSTNAME=SERVIDOR
DATABASE=CLIENTES
USER=SA
PASSWORD=
PROTOCOL=mssql
CONFIGURACAO=
TELAFUNDO=TelaFundo.JPG
TELAPRINCIPAL=telapadrao.JPG
OPCAOMENSXP=0
Quando for abrir a tabelas faça no evento OnCreate do form:
AbrirQuery(QueryClientes,false);
para fechar:
FecharQuery(QueryClientes);
Um abraço
Silvio Guedes
GOSTEI 0