org.apache.commons.dbcp.PoolableConnectionFactory#makeObject()がsynchronized宣言されているため、その内部のConnectionFactory#createConnection()が1スレッドでも無応答になると、後続のmakeObject()を呼ぶスレッドが全部待ちになってしまう。
ConnectionFactory#createConnection()が無応答にならなければ良いのだが、障害時にタイミングによってはDBからのread待ちになる場合がある模様。こうなるとOSのsocketタイムアウトまで固まりっぱなし。
最新のtrunkでも変わっていないようだし、どうしたものかなぁ・・・
artonさんの記事。Proxyを使った実装例がすばらしく、面白く読めました。