Caro Walter,
Se uma classe define um metodo synchronized, quando duas ou mais threads tentam
acessar esse metodo no contexto de uma mesma instancia, apenas uma tera' direito de
executa'-la por vez. Essa e' o mecanismo que a linguagem Java dispoe para sincronizar
o acesso concorrente a uma regiao critica do codigo (no caso, o metodo inteiro).
Existe uma variacao da sincronizacao que permite definir apenas um trecho do codigo
cujo acesso deve ser exclusivo, atraves de um *bloco* synchronized:
public void doGet (...) {
...
synchronized (this) { // inicio da regiao critica
...
// so' uma thread por vez acessara' este codigo
...
} // fim da regiao critica
...
}
A referencia a objeto this entre parenteses define qual objeto sera' utilizado
como "semaforo" para acesso 'a regiao critica. No caso, a propria servlet.
No caso especifico das servlets, ainda ha' uma terceira opcao para sincronizacao:
a classe servlet pode implementar a interface javax.servlet.SingleThreadModel, o que
tem o mesmo resultado da sincronizacao integral do metodo.
Para atendimento das requisicoes, varias threads normalmente sao utilizadas, para
permitir a prestacao dos servicos simultaneamente. Isso estava gerando o teu problema
original, que tu resolveste com a sincronizacao do metodo por inteiro. A questao e'
que assim apenas uma requisicao esta' sendo atendida por vez, gerando uma fila de
requisicoes, exatamente como tu suspeitavas.
A solucao requer que tu envolvas apenas as regioes criticas do metodo doGet com
blocos synchronized. E quais seriam estas regioes criticas? Aquelas que manipulam
objetos nao restritos 'a execucao do metodo doGet, como objetos acessados atrav�s de
variaveis de instancia da servlet (variaveis locais que acessam objetos "locais" ao
metodo doGet nao requerem protecao).
O cuidado que tens que ter e' que os objetos Statement e ResultSet devem ser
temporarios, ou seja, locais ao metodo doGet. Assim tu nao tens que proteger o acesso
a eles, o que iria causar o enfileiramento das requisicoes ao BD, que e' exatamente o
que estas querendo evitar.
Bom, se tu chegaste ate' aqui, espero que tenha ajudado. Boa sorte!
Rafael
Rafael Chaves ([EMAIL PROTECTED])
V.Office (www.voffice.com.br)
Sun Authorized Java Center
Florianopolis - SC
(+48) 224-8580
-----Mensagem original-----
De: Walter do Valle <[EMAIL PROTECTED]>
Para: [EMAIL PROTECTED] <[EMAIL PROTECTED]>; [EMAIL PROTECTED]
<[EMAIL PROTECTED]>; [EMAIL PROTECTED] <[EMAIL PROTECTED]>
Data: Segunda-feira, 20 de Mar�o de 2000 22:16
Assunto: [Java-l] Servlets thread-safe e BD
>
>Ola lista
>
>Estou precisando de uma maozinha (ou seria de um mousezinho?!) realtivo
>a Java. 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 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).
>
>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?
>
>Ufa!
>
>Minha pergunta eh: quais trechos exatamente devo sincronizar para nao
>ter dados cruzados nem amarrar a consulta???? O que posso estar fazendo
>de errado?
>
>Em tempo: conecto o banco de dados apenas no metodo init().
>
>--
>
> (_:_ --- Walter do Valle
> /---------/
> .-/. \ / \--. Universidade Federal de Santa Catarina
> / / \ \ 7 / / \ \ Ciencias da Computacao
> \ ` / -o---\--- / Florianopolis - SC
> `--' L `--' ICQ # 14305933
> ______________________________________
>
>_______________________________________________
>Java-l mailing list
>[EMAIL PROTECTED]
>https://www.inf.ufsc.br/mailman/listinfo/java-l
>
* Para nao receber mais e-mails da lista, acesse
<http://www.sun.com.br:8080/guest/RemoteAvailableLists>, coloque seu e-mail, escolha a
lista <[EMAIL PROTECTED]> e de um <submit>.