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

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

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


person Vladislav Rastrusny    schedule 11.04.2011    source источник


Ответы (3)


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

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

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

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

Я также хотел иметь возможность выполнять запросы, используя как можно меньше строк кода, и смог достичь этого с помощью jooq fluent API, который позволяет выполнять вызовы, подобные 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 описаны операторы UPDATE и DELETE. , глядя на содержимое... Но я считаю, что это действительно субъективно. Я тоже даже не могу объяснить, что не так с мануалом с моей точки зрения. Когда я смогу, я опубликую билет или два;)

В ручном режиме также не очень удобно ориентироваться, поскольку в Trac нет автоматических ссылок «туда, туда и обратно».

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

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

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

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

ссылка на примечания к выпуску в руководстве — это всего лишь дорожная карта. Я думаю, я сделаю это сам завтра...

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

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

person Vladislav Rastrusny    schedule 15.05.2011
comment
Интересно знать! Я даже не знал JOOQ, думаю, меня это не интересует (я больше за простой старый SQL в хранимых процедурах и оптимизирую для одной БД, используя его специфические функции), но из вашего описания кажется, что это ORM сделано правильно. Это слишком необычно. Так что добро пожаловать в JOOQ - person Nicolas Bousquet; 19.05.2011
comment
@FractalizeR 2 года спустя кажется, что Вики считает, что это все-таки ORM. - person yair; 14.05.2014
comment
Похоже, он будет висеть там вечно... Не знаю, плохо это или хорошо. Wiki даже говорит, что JOOQ реализует ActiveRecord... О боже.... - person Vladislav Rastrusny; 26.11.2015

Вы также можете ознакомиться с 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);
}
person TraderJoeChicago    schedule 24.09.2011

Если вы ищете только решение для построения 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

person Ahmet Alp Balkan    schedule 22.05.2011
comment
Ваша структура очень похожа на JPA/CriteriaQuery для меня. Почему вы создали свой собственный? Чем он отличается от JPA? - person Lukas Eder; 22.05.2011
comment
Почему бы тогда не внести свой вклад в jOOQ? :) - person Lukas Eder; 22.05.2011
comment
Основная цель моего проекта — создать ORM на основе аннотаций, как JPA. QueryBuilder — это просто его особенность. Это отличается от jooq. Как вы сказали jOOQ is NOT an OR-mapper., а у меня так. - person Ahmet Alp Balkan; 22.05.2011