Hmmm…
Race conditions são criadas exatamente pela sincronização, um código não sincronizado não tem corrida.
A corrida acontece pq quando duas Threads tentam pegar um lock (no caso mais simples, entrar num bloco synchronized), a que pegar primeiro continua, a outra tem que esperar até o lock ser liberado.
Todos os pools que vc inventar no mundo vão ser sincronizados, e por isso vão ter corridas. A idéia de compartilhar a conexão pra várias Threads não é ruim, pq as regiões críticas são muito pequenas. Mas vc precisa fazer um fine tuning…
Vamos considerar uma aplicação em Servlets cujo cenário típico é o seguinte:
- O servlet pega a conexão, faz várias queries pequenas (pra montar uma página de cadastro, por exemplo) e devolve a conexão.
- O servlet pega a conexão, faz zero ou uma alterações no banco, e a devolve.
Nesse caso, um pool de tamanho razoável tem uma chance grande de ter conexões livres. Daí não vale a pena compartilhar a mesma conexão com vários “clientes”.
Um outro cenário é uma aplicação RMI, onde tipicamente um “cliente” segura uma conexão bastante tempo e faz operações pequenas e a intervalos irregulares. A chance de vc ter conexões livres no pool diminui, mas em compensação o uso efetivo de cada conexão é baixo. Daí vale a pena compartilhar uma conexão com vários “clientes”.
“clientes” entre aspas significam um objeto que mantém uma conexão aberta em uma Thread.
O que vcs acham, viajei?
[]s