Java: производительность и обратная связь jOOQ persistence framework [закрыто]
Я наткнулся над хорошей платформой SQL builder, называемой JOOQ. Кстати, в русском языке JOOQ звучит как существительное, означающее " ошибка "(как насекомое)," Жук";)
Если у вас есть какие-либо отзывы о JOOQ, это производительность и такие, пожалуйста, поделитесь. Ссылки на блоги о JOOQ также приветствуются.
3 ответов
Я думаю, что я должен ответить здесь также потому, что я начал использовать jooq полтора месяца назад, поэтому у меня есть некоторый опыт.
Я хотел использовать инструмент, как jooq так:
- ORM-это перебор в моем текущем проекте (Платформа распределенных вычислений для кластера), так как мне нужно читать и писать только отдельные поля из БД, а не полные строки таблицы, и некоторые из моих запросов достаточно сложны, чтобы не выполняться простым и легким Ормс.
- Я хотел синтаксис автозаполнения для моих запросов, так что мне не нужно держать всю мою БД в виду
- Я хотел иметь возможность писать запросы непосредственно на 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
Jooq поддерживает Maven, и это большое облегчение для меня, так как все мои Java-проекты основаны на Maven. Мы все еще скучаем по maven plugin для генератор, но это не важно, так как запуск генератора-это кусок пирога. запись моих запросов с jooq я внезапно обнаружил, что они стали действительно портативными, потому что я почти никогда не использовал какую-либо особенность MySQL в коде, так как jooq пытается быть как можно более портативным. Для тех, кто не может жить с такими особенностями, как я знаю, поддержка расширений SQL также находится в пути. чего не хватает jooq на мгновение с моей точки зрения вид? и еще одна вещь. У Jooq есть хорошее руководство, но... Я не знаю. Может быть, я просто не понимаю, что это за структура или архитектура... Когда я начал использовать jooq в первый раз, я открыл одна страница за другой ищет нужную мне функцию. Например, попробуйте угадать, где в руководство jooq инструкции UPDATE и DELETE описаны, глядя на содержимое... Но это очень субъективно, я считаю. Я также не могу даже объяснить, что не так с руководством с моей точки зрения. Когда я смогу, я отправлю билет или два;) руководство также не очень хорошо судоходно, так как Trac не имеет автоматических ссылок"здесь, там и обратно". Ну, для меня в Москве (Россия) страницы Trac не открываются быстро, поэтому руководство по чтению немного скучно. руководство также пропускает хорошее описание архитектуры jooq для участников. Кажется, Jooq следует принципу "дизайн по контракту", и когда я хотел узнать, как определенная функция реализована внутри, используя мой обычный Ctrl-Click на каком-то имени метода в IDE, я оказался внутри скучного интерфейса без реализации ;) не то, что я слишком умен, чтобы сразу начать улучшать jooq, но, конечно, я пользовались бы понять, как именно jooq находится в рамках от земли вверх. жаль также, что мы не можем внести свой вклад в руководство jooq. Я ожидал, что это будет в какой-то Вики. то, что я также хотел бы улучшить, это путь Новости сообщает. Я бы предпочел ссылку на руководство или примеры того, как работает та или иная новая функция. примечания к выпуску ссылка в руководстве это просто дорожная карта. Я думаю, Я сделаю это сам завтра... Jooq также имеет относительно небольшое сообщество в настоящее время, но я рад сообщить, что это не влияет на качество кода или способ введения новых функций. Jooq действительно хороший проект. Я буду придерживаться его и для моих будущих проектов. Мне очень нравится.Ну, нет свободного API для операторов, кроме SELECT. Это немного усложняет код и делает инструкции UPDATE/DELETE немного более сложными для записи. Но я думаю, что это будет добавлено в ближайшее время. только что реализовано в 1.5.9! Ха! Слишком быстро для меня ;)
вы также можете взглянуть на 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);
}
Если вы ищете только решение SQL builder. У меня есть один проект, который является платформой ORM для Java, но он все еще преждевременен и в непрерывной разработке, однако обрабатывает многие примитивные использования баз данных. https://github.com/ahmetalpbalkan/orman
на этом этапе нет документации, однако он может создавать безопасные запросы, используя только методы цепочки Java, и может обрабатывать многие операции SQL. Он также может отображать классы-поля в таблицы-столбцы соответственно.
вот пример операции построения запроса для query
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 просто отказаться от разработки этой структуры!)
скорее всего это не сработает для вас, но просто хотел объявить мой проект :П