Olá pessoal,
Tive um problema aqui no design de nossa aplicação com relação aos requisitos de concorrência e persistência da aplicação.
A questão é: usamos DBCP como pool de conexões onde, cada método da persistência é tratado como uma operação única de “ir ao banco”, pegar uma conexão, usar, fechar e sair do método. Até ai tudo bem; o problema é que, em métodos onde existe a possibilidade de N Threads entrarem simultâneamente, ocorreram erros de conexões fechadas, ou seja, uma Thread anterior já fechou a conexão que a Thread atual ainda estava usando.
O DBCP é single-trhead, portanto não tem tratamento para ambiente concorrente.
Solução Possível: syncronized nos métodos que apresentam o problema.
O problema é que acho que isso é um problema de design de aplicação, e sincronizar os métodos é apenas um remédio. Outra possível solução é usar um pool para ambientes de alta concorrência, onde já testei o tomcat-pool que diz ser exatamente para ambientes desse tipo, mas apresentou um resultado muito pior que o DBCP.
Minhas perguntas:
Realmente é um problema de design de aplicação?
Minhas soluções propostas são válidas?
Gostaria da opinião de vocês, sempre são muito válidas. 
Abraços pessoal.