Java: JOOQ persistence framework performance and feedback [cerrado]


He tropezadosobre un buen framework SQL builder, llamado JOOQ. POR cierto, en ruso JOOQ suena como sustantivo que significa "insecto", "escarabajo";)

Si tienes algún comentario sobre JOOQ, su rendimiento y demás, por favor comparte. Enlaces a blogs sobre JOOQ también son bienvenidos.

Author: Community, 2011-04-11

3 answers

Creo que debería responder aquí también porque empecé a usar jooq hace un mes y medio, así que tengo algo de experiencia con él.

Quería usar una herramienta como jooq porque:

  • OR es un exceso en mi proyecto actual (plataforma de cálculos distribuidos para clúster) ya que necesito leer y escribir solo campos separados de la base de datos, no completar filas de tabla y algunas de mis consultas son lo suficientemente complejas como para no ser ejecutadas por OR simples y livianos.
  • quería sintaxis autocompletar mis consultas para no tener que tener toda mi base de datos en mente
  • Quería ser capaz de escribir consultas directamente en Java para que el compilador pudiera comprobar la sintaxis de consulta básica en la compilación.
  • Quería que mis consultas fueran seguras para que no pudiera pasar accidentalmente una variable de un tipo, donde se espera otra.
  • Quería SQL, pero lo quería muy conveniente y fácil de usar

Bueno, con jooq pude lograr todo eso. Mi requisito principal era para que jooq maneje consultas lo suficientemente complejas(anidadas, con agrupación, etc.). Eso se cumplió.

También quería ser capaz de ejecutar consultas utilizando tan pocas líneas de código como sea posible y fue capaz de llegar a esto con jooq fluent API que permite llamadas similares a jquery para realizar SELECTs.

En mi camino usando jooq reporté un uno o dos bugs y debo decir, que fueron arreglados sorprendentemente rápido.

También perdí algunas características y de nuevo debo decir que ya tienen casi todos ellos.

Lo que me gustó mucho, es que jooq ahora usa SLF4J para reportar algunos datos muy interesantes sobre su rendimiento, así como para generar las consultas reales que ha construido. Realmente me ayudó con la depuración.

Jooq incluso genera artefactos Java para procedimientos almacenados, UDFs y conjuntos de registros actualizables, que no uso actualmente, sin embargo.

Lo importante es que jooq soporta de forma transparente DB2, Derby, H2, HSQLDB, MySQL, Oracle, PostgreSQL, SQLite, SQL Server, Sybase SQL Anywhere. Una lista bastante extensa, creo.

Jooq tiene foro de soporte en grupos de Google donde Lukas está día y noche listo para responder incluso la más estúpida de mis preguntas.

Jooq soporta Maven y eso es un gran alivio para mí ya que todos mis proyectos Java están basados en Maven. Todavía echamos de menos el plugin Maven para generator, pero eso no es importante ya que ejecutar generator es pan comido.

Escribiendo mis consultas con jooq I de repente descubierto, que se convirtió en realmente portátil porque casi nunca se utiliza ninguna característica específica de MySQL en el código desde jooq intenta ser lo más portátil posible. Para aquellos que no pueden vivir con tales peculiaridades, como sé, el soporte para las extensiones SQL también está en camino.

¿Qué le falta a jooq por un momento desde mi punto de vista?

Bueno, no hay una API fluida para declaraciones que no sean SELECT. Esto complica un poco el código y hace que las instrucciones UPDATE/DELETE sean un poco más complejas complicado de escribir. Pero creo que esto se añadirá pronto. Se acaba de implementar en 1.5.9! Ha! Demasiado rápido para mí ;)

Y una cosa más. Jooq tiene un buen manual, pero... No sé. Puede ser que no entienda su estructura o arquitectura... Cuando empecé a usar jooq por primera vez, abrí una página tras otra buscando una función que necesitaba. Por ejemplo, trate de adivinar, dónde en jooq manual UPDATE y DELETE instrucciones se describen, mirando el contenido... Pero eso es muy subjetivo, creo. Tampoco puedo explicar, lo que está mal con manual desde mi punto de vista. Cuando pueda, publicaré uno o dos tickets;)

El manual tampoco es muy bien navegable ya que Trac no tiene enlaces automáticos "aquí, allá y atrás".

Bueno, para mí en Moscú (Rusia) las páginas Trac no se abren rápido también, por lo que leer el manual es un poco aburrido.

El Manual también echa de menos una buena descripción de la arquitectura de jooq para los colaboradores. Jooq sigue parece ser el principio de diseño por contrato y cuando quise aprender cómo se implementa cierta característica dentro usando mi habitual Ctrl-Clic en algún nombre de método en IDE, terminé dentro de una interfaz aburrida sin implementación ;) No es que sea demasiado inteligente para comenzar a mejorar jooq de inmediato, pero ciertamente disfrutaría comprender cómo exactamente jooq está arquitecturada desde cero hasta arriba.

También es una pena que no podamos contribuir al manual de jooq. Esperaba que fuera en algún tipo de wiki.

Lo que también me gustaría mejorar, es la forma se reportan noticias. Preferiría enlazar a manual allí o ejemplos de cómo funciona esta o aquella nueva característica.

El enlace de notas de la versión en el manual es realmente solo una hoja de ruta. Creo que lo haré yo mismo mañana...

Jooq también tiene una comunidad relativamente pequeña actualmente, pero me complace informar que no afecta la calidad del código o la forma en que se introducen las nuevas características.

Jooq es realmente un buen proyecto. Me apegaré a ella para mis proyectos futuros también. Realmente me gusta.

 32
Author: Vladislav Rastrusny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-15 22:08:54

También puede echar un vistazo a MentaBean, un constructor ligero de SQL y SQL que le permite estar lo más cerca posible de SQL ofreciendo mucha ayuda con el código repetitivo. He aquí un ejemplo:

Configuración programática:

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)

Una simple consulta 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);
}
 2
Author: TraderJoeChicago,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-09-24 19:43:53

Si está buscando solo una solución SQL builder. Tengo un proyecto que es un framework Java para Java pero todavía es prematuro y en continuo desarrollo sin embargo maneja muchos usos primitivos de bases de datos. https://github.com/ahmetalpbalkan/orman

No hay documentación en esta etapa, sin embargo, puede construir consultas seguras utilizando solo métodos de cadena Java y puede manejar muchas operaciones SQL. También puede asignar clases-campos a tablas-columnas respectivamente.

Aquí hay una operación de construcción de consultas de ejemplo para query

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

Código 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 acaba de renunciar a desarrollar ese marco!)

Lo más probable es que no funcione para usted, pero solo quería anunciar mi proyecto :P

 0
Author: Ahmet Alp Balkan - Google,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-05-22 13:09:31