Performance Servlet/jsp

21 respostas
M

Estou fazendo uma aplicação web usando displaytags.
A aplicação ainda encontra-se local(Só acessada atraves de 127.0.0.1)
Estou testando a aplicação em um banco local e outro em outro estado,quando acessado localmente a geração de tabelas com displaytags é instantanea,porem com o banco online um select simples que retorna 5 linhas está demorando em média 30 ,tornando o sistema inviavel,uma vez que outras tabelas trarão centenas de registro.
O banco é oracle,o driver é o classes12.jar
a conexao é velox 512
O servidor de outro estado é giganteco(não tenho a configuração aqui mas só sei que é muita coisa!)
Gerei uma tabela na munheca tb mas a performance foi a mesma.
Alguem saberia dizer o por que dessa demora toda???
Como fazer pra melhorar a performance???

21 Respostas

Rafael_Steil

Ja verificou se nao eh problema de rede? tipo firewall / proxy com alguma configuracao maluca…

Rafael

M

Acho que não… pois temos uma aplicação em delphi que podemos acessar o banco de lá,eu tenho esse mesmo select na aplicação delphi que leva no maximo 2 segundos ,claro que eu não estou querendo comparar a aplicação delphi que não tem nenhum processamento com a aplicação java porem a diferença de performance é gritante!

Rafael_Steil

Bom, ate que uma sugestao que resolva o teu problema apareca, acho que voce deveria checar isso. Ja vi alguns bons ( ou seriam maus? ) casos onde o pessoal batia o peh que o problema era a aplicacao mal-escrita e nao a rede, para no final ficarem com caras de tacho quando viam que o problema era de fato configuracoes / restricoes de rede.

Mesmo os 2 segundos da tua consulta em Delphi eh muito tempo, para somente 5 linhas. Ja tentou popular a tua tabela local com alguns milhoes de registros para ver se continua rodando rapido?

Rafael

M

tenho um select bem grande com milhares de registros que local leva na faixa de 18 segundos para aparecer…remotamente…eu posso tomar um cafezinho…dormir…acordar…e o select ainda está lá processando!

_fs

Bom, erro básico a ser checado: você está liberando todos os recursos (como conexões, resultsets etc) o mais rápido possível, certo?

T

Alow Marcelo.

O oracle permite dois tipos de conexao, ele tem drivers do tipo II e tipo IV. Qual dos dois modos voce esta usando?

Como ja deves saber, driver do tipo II possui uma parte nativa (que seria o acesso ao SQLNet do Oracle) enquanto que drivers do tipo IV sao puramente java.

Ai o que acontece, para acessar o oracle, o Delphi usa o SQLNet. Se voce usa o driver do tipo IV no java, voce nao usa o sqlnet, vai direto para o servidor. Para fazer o acesso igual, use o driver do tipo II, de forma que sua aplicacao java vai usar o SQLNet tambem (atraves do JNI), soh para testes. A performance tem que ser equivalente ao programa em Delphi.

Se a aplicacao funcionar bem com tipo II e lerdo com tipo IV, isso quer dizer nhaca em firewall, configuracoes, ai tem que ver, ja que teu servidor de banco esta longe, acessivel via internet.

Outra coisa. Para realizar os testes do select, sugiro que use um cliente sql em java, tipo o JDBCFace, ou similar, a fim de isolar o problema. Faz os testes nesse cliente de conexao tipo II e tipo IV.

Luca

Olá

Há milhares de maneiras de fazer isto. Todas que acessam a base direto do cliente estão obsoletas, isto é o velho e antiquado modelo cliente servidor. Envie uma mensagem para o servidor e lá faça a consulta. O servidor envia para o cliente o resultado filtrado e se der na telha zipado.

[]s
Luca

M

Ei tanque…
Tô tentando fazer os testes que vc recomendou porem no site da oracle os drivers não possuem a divisão em tipos…Mas que eu me lembre um driver pode ser de varios tipos não é?
Como é que eu diferencio? Pelo jeito de acessar??

T

O driver, a principio, eh o mesmo. A unica diferenca eh o metodo de conexao, a connection string. Entretanto, a versao do teu classes[111|12].jar precisa ser compativel com o sqlnet instalado na sua maquina. Se o driver jdbc veio da mesma instalacao do client da oracle, nao tera com o que se preocupar.
Supondo que voce tenha uma conexao com o oracle chamad tcplocal, (sqlplus user/pass@tcplocal funcione) a connection string para passar para o driver jdbc, no getConnection eh :
jdbc:oracle:oci8:@tcplocal
ou
jdbc:oracle:oci:@tcplocal

Dependendo da versao do seu oracle

Rafael_Steil

Eu me lembro de ter visto uma vez que ha outras formas de conexao, como o “thin”, que, ao que me parece, seria o melhor para o seu caso.

Rafael

T

Tambem concordo na maioria dos casos, Rafael, mas no caso dele parece que a conexao por oci(tipo II), ao inves da thin(tipo IV) eh melhor, porque ele relata que a aplicacao delphi eh rapido, e a java eh lerda. O Delphi obrigatoriamente passa pelo driver OCI. Facamos o java passar tambem pelo driver oci entao.

M

Ei cara,deixa eu ver se eu entendi…
a unica diferença da minha string de conexao antiga será a fonte dos dados…
em vez de passar
“jdbc:oracle:thin:@IP:1521:DATABASE”
eu passo
“jdbc:oracle:oic:@IP:1521:SQLNET”

ou tenho que fazer mais alguma coisa???

Rafael_Steil

Acho que eh isso. Se voce olhou da documentacao respectiva do Oracle e disse que era assim mesmo, entao mete bala :wink:

Rafael

T

“marcelo_”:
Ei cara,deixa eu ver se eu entendi…
a unica diferença da minha string de conexao antiga será a fonte dos dados…
em vez de passar
“jdbc:oracle:thin:@IP:1521:DATABASE”
eu passo
“jdbc:oracle:oic:@IP:1521:SQLNET”

ou tenho que fazer mais alguma coisa???

Negativo, para conexao OCI, primeiro voce configura o servidor/porta/Database no SQLNET da tua maquina. Uma vez configurado, testado, voce da um nome para essa conexao, la no SQLNET.
ai a string fica

jdbc:oracle:oci:@NOMESQLNET

Rafael_Steil

OCI eh um driver do tipo 2, nao? ao propria oracle recomenda utilizar o thin.

Rafael

T

Primeiramente, sugeri o uso do driver do Tipo II, no caso do Marcelo porque a aplicacao em delphi dele da um desempenho bom e a java da um desempenho sofrivel. Usando o driver OCI, tipo II, A parte de comunicacao de rede teoricamente fica igual tanto na aplicacao delphi quanto na java. Vamos ter que esperar o marcelo realizar os testes para sabermos se o uso do driver do tipo II foi efetivo ou nao.
Em segundo lugar, o fato da oracle ainda manter os drivers do tipo II deve ter algum motivo. Performance pode ser um deles. Nao vou entrar em meritos de performance, mas usando o SQLNet existem varios tipos de conexao que se pode fazer com o oracle, tipo IPC, TCP, Named Pipes, BEQ. Usando o driver do tipo IV, somente TCP pode ser explorado sendo que para alguns casos os outros tipos sao mais indicados. De qualquer forma se ele existe ele esta ai para testar e usar. Eu nao me surpreenderia se eu fizesse um benchmark entre os dois drivers e o driver do Tipo II, com um tunning do SQLNet, ganhasse.
E em terceiro lugar eh incompatibilidade. Sofri uma vez com o oracle 8i na questao de querer carregar BLOBS nele usando o driver do tipo IV. Simplesmnete, o limite do driver, para blobs, era de 4 KBytes. Ridiculo. Passei a usar o driver do tipo II e o limite desapareceu. Depois descobri que realmente era uma limitacao do driver do tipo IV da epoca, ja deve estar consertado, mas meu trauma ficou.

M

Alow…Ei Tanque
Na documentação da oracle diz:

For the JDBC OCI Driver:

  Connection conn = DriverManager.getConnection(
                      "jdbc:oracle:oci:@<database>",
                      "my_user", "my_password");

  where <database> is either an entry in tnsnames.ora or a SQL*net
  name-value pair.

  Eutô pasando o tnsnames correto porem aparece a mensagem

   " URL Oracle Inválido especificado "

já aconteceu contigo?

M

E tem outra coisa…Quando eu uso o mesmo driver da oracle ele dá o erro que eu descrevi…só que quando eu uso o memso driver da oracle como thin ele fica mais lento do que acessando o servidor remoto, o driver é pra jdk 1.2 quando eu troco o driver ele dá um erro

javax.servlet.ServletException: Servlet execution threw an exception

por que não reconhece o meu jar mesmo mudando tb o do oracle

resumindo,mesmo que eu consiga acessar banco via SQLNet a performance dele vai ficar bem inferior a da aplic~ção em delphi

T

Ola marcelo.

Tente a conexao assim, estou supondo que seu oracle eh o oracle 8i, ja que ele deu erro sem o 8 ali:

Connection conn = DriverManager.getConnection(
“jdbc:oracle:oci8:@<database>”,
“my_user”, “my_password”)
;

Quanto as suas duvidas de performance, realmente, tem que testar. Mas uma coisa lhe digo. O sistema de comunicacao de rede do thin e do oci eh bem diferente. Se o problema estiver ali, a performance do modo oci pode ser bem superior ao modo thin.

E como falei, sugiro que voce use um cliente sql fora da aplicacao, soh para testar a conexao.

QUanto a versao do jar, 111 ou 12 , ja usei os dois, nos dois modos sem problemas. Mas fique com o que nao da erro, obviamente.
[/b]

M

Eita nois!
Consegui logar pelo oci porem a performance ficou a mesma ó!Rápida no local e muito lenta no remoto,o driver que eu usei foi o mais recente,deu certo,logou… mas a performance…

T

Ola Marcelo.
Realmente muito estranho esse comportamento. A unica duvida que me resta eh se voce chegou a executar a mesma query usando o programa tipo o JFacedbc ( http://www.pratocity.com/index.jsp?mod=/jface/jfacedbc.jsp) . Soh para tirar a duvida da aplicacao. Se a query rodar a contento pela shell ali, ai o problema pode estar na aplicacao. Mas se ficar lerdo mesmo na shell, com driver tipo II eh um misterio realmente.

Criado 9 de junho de 2004
Ultima resposta 16 de jun. de 2004
Respostas 21
Participantes 5