src/main/java/org/vibur/dbcp/proxy/ConnectionInvocationHandler.java
private StatementHolder getCachedStatement(Method method, Object[] args) throws SQLException {
        if (statementCache != null) {
            return statementCache.take(new StatementMethod(getTarget(), this, method, args));
        }

        return getUncachedStatement(method, args, (String) args[0]);
    }
private StatementHolder getCachedStatement(Method method, Object[] args) throws SQLException {
        if (statementCache != null) {
            return statementCache.take(new StatementMethod(getTarget(), this, method, args));
        }

        return getUncachedStatement(method, args, (String) args[0]);
    }
Returns <i>a possibly</i> cached StatementHolder object for the given proxied Connection object and the
invoked on it "prepare..." Method with the given args.

@param method the invoked method
@param args the invoked method arguments
@return a retrieved from the cache or newly created StatementHolder object wrapping the raw JDBC Statement object
@throws SQLException if the invoked underlying "prepare..." method throws an exception