I want to report our findings in case someone stumbles across this thread.
DBCP realization of poolPreparedStatements seems to contain bug. We observed that in a rare cases under heavy load some statements (procedure calls and select statements) were executed on different physical connections (monitored using database tracelog). We had no time to dig deeper, but now when we disabled statement caching the problem has gone, On the other hand there is no perforamce degradation, as the database (TimesTen in this case, but sure Oracle will do same) has capabilities to reuse prepared statements, i.e. has its own statement cache, so it seems that any kind of statement caching on the client side is redundant if the same can be done by configuring database options.