Caro Walter:
Vamos pensar juntos.
> Estou desenvolvendo um servlet java que acessa um
> banco de dados
> DB2. Em um primeiro momento tive problemas com consultas de um usuario
> que entravam no browser de outro usuario que fez uma outra consulta no
> mesmo instante. Pesquisei um pouco e descobri que o servlet deve ser
> thread-safe. Bem, declarei o metodo doGet() do servlet como sendo
> synchronized. Isto resolveu meu problema
Corret�ssimo. Como o servlet � instanciado apenas uma vez pelo
WebServer, todas as conex�es estar�o acessando o mesmo objeto,
consequentemente os mesmos dados. Isso realmente causa problemas quando com
v�rias conex�es. Problemas estes resolvidos com o syncronizes.
> mas me criou outro problema.
> Agora as consultas nao mais se confundem, mas ao que parece o
> WebServer
> estah enfileirando as consultas, de modo que as mesmas demoram uma
> eternidade (alguns minutos!!!) para serem executadas
> simultaneamente. Se
> forem feitas idividualmente sao bem rapidas (quase instantaneas).
Como o m�todo � syncronized, somente uma conex�o por vez ter� acesso
ao m�todo. Isso sem d�vida causar� o enfileiramente, como voc� citou.
Enquanto uma conex�o est� executando sua tarefa, as outras tem que esperar
para que esta termine.
Solu��o: Crie thread para processar cada conex�o.
Ao inv�s do m�todo doGet() fazer o processamento, este apenas
instancia um novo thread para cada conex�o e esse thread � que faz o
processamento, liberanto o m�todo doGet() quase que instantaneamente.
O que voc� ter� que fazer � criar uma nova classe, que ir� conter o
c�digo que hoje est� do seu m�todo doGet(). Essa classe dever� extender a
class Thread (ou implementar a interface Runnable).
Com isso, o seu doGet() conteria apenas instanciaria sua nova classe
(passando os devidos par�metros, obviamente) e executaria o start() na mesma
e esta sim faria o processamento.
Se precisar de ajuda sobre thread, consulte a documenta��o ou pe�a
ajuda na lista.
> O DBA deste meu banco me disse que sempre aparece apenas uma
> conexao ao
> banco de dados, nao importa quantos usuarios estejam consultando via
> servlet. Isto eh normal?
� normal para a sua forma de implementa��o. Voc� est� abrindo a
conex�o no m�todo init(), que � executado apenas uma vez, j� que todas as
conex�es compartilham o mesmo objeto.
Voc� pode tirar a conex�o de l� e fazer essa conex�o junto com o
c�digo do doGet(). A� � uma op��o sua, pode ser melhor ou pior. Voc� ter�
que ter tato pra descobrir isso, para o seu caso.
Boa sorte!
Vanei Anderson Heidemann
Senior Programmer
Sun Certified JAVA Developer
DATASUL S.A.
"Nunca estamos mais longe do nosso desejo do que quando imaginamos possuir o
desejado."
Cadastre seu Curriculum na Internet:
http://www.curriculum.com.br/indicadopor.asp?indicadopor=P2044-402
For my always up-to-date contact information, click here:
http://www.planetall.com/main.asp?cid=1073200
It's private, secure, and free!
Vanei Anderson Heidemann.vcf