Ten sam problem mieliśmy w systemie produkcyjnym z Tomcat6+Hibernate+MySQL (i Spring w naszym przypadku) i jedynym niezawodnym rozwiązaniem, jakie znaleźliśmy, było ustawienie limitu czasu połączenia na dużą wartość w konfiguracji MySQL. Nie pamiętam szczegółów, ale uważam, że wystąpił problem z podstawowym commons-pool kod, gdy sprawdza, czy zasób w puli jest prawidłowy.
Inną możliwością, której nie próbowaliśmy, było użycie alternatywnego mechanizmu pulowania połączeń innego niż DBCP. Następny do wypróbowania byłby C3PO