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>.

Responder a