Estou com um problema de concorrência com uma aplicação. Nela tenho um método sincronizado que é executado n (1 até 14) vezes. Este método faz um select para gerar uma chave primária e depois um insert. Posso estar gerando um “gargalo” na minha aplicação com isso? Não estou utilizando pool de conexões (dbcp), ou seja, cada request faz uma conexão com o banco de dados.
Com certeza é um gargalo do sistema…
Você pode clocar esse processo como uma thread separada, que tal?
como poderia fazer isso daniel? Tem alguma sugestão?
Na verdade responda a si mesmo primeiramente.
Qual a necessidade do método ser sincronizado?
(pode responder aqui pra mim tbm, tá… hehehehe)
O método é synchronized por eu estar gerando pk´s com ele. Acabei fazendo a alteração deixando a geração para o db fazer. Mas isso não resolveu meu problema, ainda tinha lentidão de acessos, era um caos. Estou utilizando o PostgreSQL e percebí que havia problemas. Como trabalho numa universidade as coisas são bem diferentes de uma empresa de desenvolvimento de software, sabe como é, os papeis não são muito definidos. Tive que me meter a DBA. Primeiro verifiquei que a versão do Postgre era a 7.2.x (atual é 7.3.4). Baixei a nova, compilei e instalei. Aí vem a pior parte, fazer uma sintonia fina para obter o melhor em termos de performance do db. O dia começou hoje, e a diferença é gritante. Resumindo, não sei até que ponto a alteração que efetuei em minha classe surtiu algum efeito, mas com certeza não foi mais do que 10% do que ganhei em performance.
Consultorias em PostgreSQL por favor me ligem… brincadeira, espero nunca mais precisar me afundar no submundo dos databases.
Você pode evitar de usar o método todo sincronizado e fazer apenas a parte de geracao da PK insercao sincronizados.
[code]public void seuMetodo( ) {
// faz algo …
synchronized( this ) {
// gera sua PK
// insere no DB
}
// faz mais algo
}[/code]