Подтвердить что ты не робот

Java: производительность и постоянство производительности JOOQ

наткнулся на хорошую структуру SQL-конструктора, называемую JOOQ. BTW, на русском языке JOOQ звучит как существительное, означающее "ошибка" (как насекомое), "жук" ;)

Если у вас есть какие-либо отзывы о JOOQ, то производительность и т.д., пожалуйста, поделитесь. Ссылки на блоги о JOOQ также приветствуются.

4b9b3361

Ответ 1

Я думаю, что я должен ответить здесь также, потому что я начал использовать jooq полтора месяца назад, поэтому у меня есть некоторый опыт работы с ним.

Я хотел использовать инструмент jooq, потому что:

  • ORM - это избыток в моем текущем проекте (платформа распределенных вычислений для кластера), так как мне нужно читать и писать только отдельные поля из db, а не полные строки таблицы, а некоторые из моих запросов достаточно сложны, чтобы не выполняться простым и легкие ORM.
  • Мне нужно автозаполнение синтаксиса для моих запросов, чтобы мне не нужно было учитывать всю мою БД.
  • Я хотел иметь возможность писать запросы непосредственно на Java, чтобы компилятор мог проверить базовый синтаксис запроса при сборке.
  • Я хотел, чтобы мои запросы были безопасными по типу, поэтому я не мог случайно передать переменную одного типа, где ожидается другая.
  • Мне нужен SQL, но я хотел, чтобы он был очень удобным и простым в использовании.

Ну, с jooq я смог добиться всего этого. Мое основное требование заключалось в том, чтобы jooq обрабатывал сложные достаточно запросы (вложенные, с группировкой и т.д.). Это было выполнено.

Я также хотел иметь возможность запускать запросы, используя как можно меньше строк кода, и смог достичь этого с помощью API-интерфейса jooq, который позволяет jQuery-вызовам выполнять SELECT.

На моем пути использования jooq я сообщил одну или две ошибки, и я должен сказать, что они были исправлены на удивление быстро.

Я также пропустил некоторые функции и снова должен сказать, что у меня уже есть почти все из них.

Что мне очень понравилось, так это то, что jooq теперь использует SLF4J для сообщения очень интересных данных об этой производительности, а также для вывода фактических запросов, которые он создал. Это действительно помогло мне отлаживать.

Jooq даже генерирует артефакты Java для хранимых процедур, UDF и обновляемых наборов записей, которые я не использую в настоящее время.

Что важно, jooq прозрачно поддерживает DB2, Derby, H2, HSQLDB, MySQL, Oracle, PostGreSQL, SQLite, SQL Server, Sybase SQL Anywhere. Довольно обширный список, я думаю.

Jooq имеет форум поддержки в группах Google, где Лукас день и ночь готов ответить даже на самые глупые из моих вопросов.

Jooq поддерживает Maven и это большое облегчение для меня, поскольку все мои Java-проекты основаны на Maven. Мы по-прежнему скучаем по плану Maven для генератора, но это не важно, так как запуск генератора - это кусок пирога.

Написав свои запросы с помощью jooq, я неожиданно обнаружил, что они стали действительно переносимыми, потому что я почти никогда не использовал какую-либо специфичную для MySQL функцию в коде, поскольку jooq пытается быть максимально переносимым. Для тех, кто не может жить с такими особенностями, поскольку я знаю, что поддержка расширений SQL также находится под этим руководством.

Чего не хватает jooq с моей точки зрения?

Ну, нет свободного API для других операторов, кроме SELECT. Это немного усложняет код и делает инструкции UPDATE/DELETE немного сложнее писать. Но я думаю, что это будет добавлено в ближайшее время. Только что реализовано в 1.5.9! Ха! Слишком быстро для меня;)

И еще одно. Jooq имеет хорошее руководство, но... я не знаю. Может быть, я просто не понимаю его структуры или архитектуры... Когда я впервые начал использовать jooq, я открыл одну страницу за другой, ища подходящую мне функцию. Например, попробуйте угадать, где в jooq manual описаны описания UPDATE и DELETE, глядя на содержимое... Но это действительно субъективно, я считаю, Я также не могу даже объяснить, что неправильно с руководством с моей точки зрения. Когда я смогу, я отправлю билет или два;)

Руководство также не очень хорошо судоходно, поскольку у Trac нет автоматических ссылок "здесь, туда и обратно".

Хорошо, для меня в Москве (Россия) страницы Trac не открываются быстро, поэтому чтение руководства немного скучно.

В руководстве также отсутствует хорошее описание архитектуры jooq для авторов. Jooq следует принципу дизайна по контракту, и, когда мне хотелось узнать, как реализована определенная функция внутри, используя мой обычный Ctrl-Click по имени какого-либо метода в среде IDE, я оказался внутри тусклого интерфейса без реализации;) Не то, чтобы Я слишком умный, чтобы сразу начать улучшать jooq, но, конечно, мне было бы приятно понять, как именно jooq имеет архитектуру с нуля.

Жаль, что мы не можем вносить вклад в руководство jooq. Я ожидал, что это будет какая-то вики.

То, что я также хотел бы улучшить, способ новости сообщил. Я бы предпочел ссылку на руководство или примеры того, как работает эта новая функция.

Ссылка на примечания к выпуску в руководстве - это действительно дорожная карта. Думаю, я сделаю это сам завтра...

Jooq также имеет относительно небольшое сообщество в настоящее время, но я рад сообщить, что он не влияет на качество кода или способ введения новых функций.

Jooq - действительно хороший проект. Я буду придерживаться этого для моих будущих проектов. Мне это очень нравится.

Ответ 2

Вы также можете взглянуть на MentaBean, легкий ORM и SQL Builder, который позволяет максимально приблизить SQL-предложение много помощи с шаблоном кода. Вот пример:

Программная конфигурация:

private BeanConfig getUserBeanConfig() {

    // programmatic configuration for the bean... (no annotation or XML)

    BeanConfig config = new BeanConfig(User.class, "Users");
    config.pk("id", DBTypes.AUTOINCREMENT);
    config.field("username", DBTypes.STRING);
    config.field("birthdate", "bd", DBTypes.DATE); // note that the database column name is different
    config.field("status", new EnumValueType(User.Status.class));
    config.field("deleted", DBTypes.BOOLEANINT);
    config.field("insertTime", "insert_time", DBTypes.TIMESTAMP).defaultToNow("insertTime");

    return config;
}

   // create table Users(id integer primary key auto_increment, 
   // username varchar(25), bd datetime, status varchar(20), 
   // deleted tinyint, insert_time timestamp)

Простой запрос соединения SQL:

Post p = new Post(1);

StringBuilder query = new StringBuilder(256);
query.append("select ");
query.append(session.buildSelect(Post.class, "p"));
query.append(", ");
query.append(session.buildSelect(User.class, "u"));
query.append(" from Posts p join Users u on p.user_id = u.id");
query.append(" where p.id = ?");

stmt = conn.prepareStatement(query.toString());
stmt.setInt(1, p.getId());

rset = stmt.executeQuery();

if (rset.next()) {

    session.populateBean(rset, p, "p");

    u = new User();

    session.populateBean(rset, u, "u");

    p.setUser(u);
}

Ответ 3

Если вы ищете только SQL-конструктор. У меня есть один проект, который является основой ORM для Java, но он все еще преждевременен и в непрерывном развитии, однако обрабатывает многие примитивные использования баз данных. https://github.com/ahmetalpbalkan/orman

На этом этапе документации нет, однако он может создавать безопасные запросы, используя только методы цепочки Java и может обрабатывать многие операции SQL. Он также может отображать классы-поля в таблицы-столбцы соответственно.

Здесь пример операции построения запроса для запроса

SELECT COUNT(*) FROM sailors WHERE
    rating>4 AND rating<9 GROUP BY rating HAVING AVG(age)>20;

Код Java:

    QueryBuilder qb = QueryBuilder.getBuilder(QueryType.SELECT);
    System.out.println(qb
            .from("sailors")
            .where(
                    C.and(
                            C.gt("rating", 5),
                            C.lt("rating", 9)))
            .groupBy("rating")
            .having(
                    C.gt(
                            new OperationalField(QueryFieldOperation.AVG,
                    "age").toString(), 20)
                    ).getQuery());

(LOL просто отказаться от разработки этой структуры!)

Скорее всего, это не сработает для вас, а просто хочет объявить мой проект: P