Java: производительность jOOQ persistence framework и обратная связь [закрыто]
Я наткнулся на хорошую структуру SQL builder, называемую JOOQ. Кстати, в русском языке JOOQ звучит как существительное, означающее " жук " (как насекомое)," Жук";)
Если у вас есть какие-либо отзывы о JOOQ, его производительности и так далее, пожалуйста, поделитесь. Ссылки на блоги о JOOQ также приветствуются.
3 ответов:
Я думаю, что должен ответить здесь также, потому что я начал использовать jooq полтора месяца назад, поэтому у меня есть некоторый опыт работы с ним.
Я хотел использовать такой инструмент, как jooq, потому что:
- ORM-это перебор в моем текущем проекте (Платформа распределенных вычислений для кластера), так как мне нужно читать и писать только отдельные поля из БД, а не полные строки таблицы, и некоторые из моих запросов достаточно сложны, чтобы не выполняться простыми и легкими ORMs.
- мне нужен был синтаксис автозаполнение для моих запросов, так что мне не нужно держать всю мою БД в виду
- я хотел иметь возможность писать запросы непосредственно на Java, чтобы компилятор мог проверять базовый синтаксис запросов при сборке.
Я хотел, чтобы мои запросы были типобезопасными, чтобы я не мог случайно передать переменную одного типа, где ожидается другой.- я хотел SQL, но я хотел, чтобы он был очень удобным и простым в использовании
Ну, с Джуком я смог добиться всего этого. Моим главным требованием было: для jooq достаточно обрабатывать сложные запросы (вложенные, с группировкой и т.д.). Это было исполнено.
Я также хотел иметь возможность выполнять запросы, используя как можно меньше строк кода, и смог достичь этого с помощью jOOQ fluent API, который позволяет jQuery-подобным вызовам выполнять выбор.
По пути использования jooq я сообщил об одной или двух ошибкахи должен сказать, что они были исправлены на удивление быстро.
Я также пропустил некоторые особенности и снова должен сказать, что я уже есть почти все из них.
Что мне очень понравилось, так это то, что jooq теперь использует SLF4J для представления некоторых очень интересных данных о его производительности, а также для вывода фактических запросов, которые он построил. Это действительно помогло мне с отладкой.
Jooq даже создает артефакты Java для хранимых процедур, UDFs и обновляемых наборов записей, которые я в настоящее время не использую.
Что важно, jooq прозрачно поддерживает DB2, Derby, H2, HSQLDB, MySQL, Oracle, PostGreSQL, SQLite, SQL Server, Sybase SQL где угодно. Довольно обширный список, я думаю.
У Jooq естьфорум поддержки в Google groups , где Лукас день и ночь готов ответить даже на самые глупые мои вопросы.
Jooq поддерживает Maven, и это большое облегчение для меня, так как все мои Java-проекты основаны на Maven. Нам все еще не хватает плагина Maven для генератора, но это не важно, так как запуск генератора-это кусок пирога.
Записывая свои запросы с jooq я вдруг обнаружил, что они стали действительно портативными, потому что я почти никогда не использовал какую-либо специфичную для MySQL функцию в коде, так как jooq пытается быть максимально портативным. Для тех, кто не может жить с такими особенностями, как я знаю, поддержка расширений SQL также находится в стадии разработки.
Чего не хватает Джуку на мгновение с моей точки зрения?
Ну, нет никакого свободного API для операторов, кроме SELECT. Это немного усложняет код и делает операторы UPDATE / DELETE немного больше сложно писать. Но я думаю, что это будет добавлено в ближайшее время.только что реализовано в 1.5.9! Ха! Слишком быстро для меня;)И еще кое-что. У Джука есть хорошее руководство, но... Я не знаю. Может быть, я просто не понимаю, что это за структура или архитектура... Когда я начал использовать jooq в первый раз, я открывал одну страницу за другой в поисках нужной мне функции. Например, попробуйте угадать, где вjOOQ manual описаны инструкции UPDATE и DELETE, глядя на содержимое... Но это действительно субъективно, я полагаю. Я также не могу даже объяснить, что плохого в руководстве с моей точки зрения. Когда я смогу, я отправлю билет или два;)
Руководство также не очень хорошо судоходно, так как Trac не имеет автоматических ссылок "здесь, там и обратно".
Ну, для меня в Москве (Россия) Trac страницы не открываются быстро, так что руководство по чтению немного скучновато.
В руководстве также отсутствует хорошее описание архитектуры jooq для участников. Jooq образом принцип проектирования по контракту кажется, и когда я хотел узнать, как определенная функция реализована внутри, используя мой обычный Ctrl-Click на некотором имени метода в IDE, я оказался внутри скучного интерфейса без реализации ;) не то, чтобы я был слишком умен, чтобы начать улучшать jooq сразу,но, конечно, я хотел бы понять, как именно jOOQ архитектурен с нуля.
Жаль также, что мы не можем внести свой вклад в руководство jooq. Я ожидал, что это будет в какой - то форме. вики.
То, что я также хотел бы улучшить, это способ новости сообщаются . Я бы предпочел ссылку на руководство там или примеры того, как работает та или иная новая функция.
Ссылка на руководство - это всего лишь дорожная карта. Я думаю, что сделаю это сам завтра...
JOOQ также имеет относительно небольшое сообщество в настоящее время, но я рад сообщить, что это не влияет на качество кода или способ введения новых функций.
Jooq-это действительно хороший проект. Я буду придерживаться его и для моих будущих проектов. Мне это очень нравится.
Вы также можете взглянуть на 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 join:
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); }
Если вы ищете только решение SQL builder. У меня есть один проект, который является платформой ORM для Java, но он все еще преждевременен и находится в непрерывном развитии, однако обрабатывает многие примитивные использования баз данных. https://github.com/ahmetalpbalkan/orman
На этом этапе нет документации, однако он может строить безопасные запросы, используя только методы Java chain, и может обрабатывать множество операций 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
Comments