private Object sql(Method method, Object[] args, Sql annotation) throws Exception {
        Connection c = connector.connect();
        try {
            try {
                PreparedStatement st = statement(args, annotation, c);
                Class ret = method.getReturnType();
                if (ret != Void.TYPE) {
                    return select(st, ret);
                }
                else {
                    update(st);
                    return null;
                }
            }
            finally {
                c.close();
            }
        }
        catch (SQLException e) {
            //connection is closed here
            if (handler.repeat(e))
                return sql(method, args, annotation);
            throw e;
        }

    }