Jdbi: Documentos / Ejemplo: proporcione un ejemplo (repositorio) para mostrar cómo integrar jdbi3 en spring-boot

Creado en 20 feb. 2018  ·  10Comentarios  ·  Fuente: jdbi/jdbi

Me gustaría integrar jdbi3 en spring-boot. Pero es difícil encontrar todas las piezas necesarias en Internet para obtener una imagen completa.
¿Existe alguna posibilidad de proporcionar un repositorio jdbi-examples-repository en github, que solo muestre cómo configurar una aplicación de arranque de primavera con jdbi3?

Te lo agradecería mucho. Muchas gracias.
/ Seb

doc help wanted improvement

Comentario más útil

He estado usando el siguiente método con jdbi2.x sin ningún problema. Lo he estado probando con jdbi3.xy no he visto ningún problema. Esto parece una forma más sencilla de hacer que Spring administre transacciones mientras se usa jdbi.

Básicamente, envuelve el proxy con un TransactionAwareDataSourceProxy y lo usa para crear la instancia de Jdbi. (He c / p'd de la respuesta de @arteam para que los ejemplos sean consistentes)

    <strong i="8">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="9">@Bean</strong>
    public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
        return new TransactionAwareDataSourceProxy(dataSource);
    }

    <strong i="10">@Bean</strong>
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        //not sure if this is needed
        return new DataSourceTransactionManager(dataSource);
    }

    <strong i="11">@Bean</strong>
    public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
        //note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
        return Jdbi.create(dataSource);
    }

    <strong i="12">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

Todos 10 comentarios

En un caso simple, si no necesita una integración con las instalaciones de transacciones de Spring, puede simplemente inicializar Jdbi y sus DAO en una configuración de Spring:

    <strong i="7">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="8">@Bean</strong>
    public Jdbi createJdbi(DataSource dataSource) {
        return Jdbi.create(dataSource);
    }

    <strong i="9">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

hola @bastman , @ alwins0n está contribuyendo con un mejor soporte de Spring en el n. ° 989: ¿le gustaría revisar su trabajo hasta ahora y comentar si hace que su integración de Spring sea más clara o si está pidiendo algo ligeramente diferente?

La integración de jdbi a Spring Boot es trivial, solo necesita configurar un método anotado @Bean en su clase @Configuration para devolver una instancia de Jdbi, como lo muestra @arteam

Lo más difícil, como hice en mi PR de primavera, es integrar jdbi en la gestión de transacciones de primavera. Definitivamente deberías comprobarlo, si es lo que estás buscando.

Además, si esto se aprueba, estoy considerando crear una configuración automática / spring-boot-starter para spring boot (2). si eso es lo que buscas. (en realidad, es un buen ejercicio si quieres probarlo tú mismo: https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html)

He estado usando el siguiente método con jdbi2.x sin ningún problema. Lo he estado probando con jdbi3.xy no he visto ningún problema. Esto parece una forma más sencilla de hacer que Spring administre transacciones mientras se usa jdbi.

Básicamente, envuelve el proxy con un TransactionAwareDataSourceProxy y lo usa para crear la instancia de Jdbi. (He c / p'd de la respuesta de @arteam para que los ejemplos sean consistentes)

    <strong i="8">@Bean</strong>
    public DataSource dataSource() {
        // From Spring Boot's connection pool configuration;
    }

    <strong i="9">@Bean</strong>
    public TransactionAwareDataSourceProxy txDataSource(DataSource dataSource) {
        return new TransactionAwareDataSourceProxy(dataSource);
    }

    <strong i="10">@Bean</strong>
    public PlatformTransactionManager transactionManager(DataSource dataSource) {
        //not sure if this is needed
        return new DataSourceTransactionManager(dataSource);
    }

    <strong i="11">@Bean</strong>
    public Jdbi createJdbi(TransactionAwareDataSourceProxy dataSource) {
        //note that parameter is TransactionAwareDataSourceProxy instead of plain DataSource
        return Jdbi.create(dataSource);
    }

    <strong i="12">@Bean</strong>
    public UserDao userDao(Jdbi jdbi) {
        return jdbi.onDemand(UserDao.class);
    }

se ve bien, no sabía que existía esta clase.

¿Podrías echar un vistazo a las relaciones públicas mencionadas anteriormente? Ya se ha hecho una sugerencia sobre una fábrica de conexiones "consciente de transacciones" subyacente a jdbi.

iirc, el problema sigue siendo que la conexión y el identificador no están sincronizados en el estado. por lo que este ds devuelve una conexión (que está vinculada a la transacción) que se cierra al final de la transacción. mientras que el identificador usado no está cerrado y arroja excepciones al intentar (re) usarlo.

pero tal vez esto no sea un gran problema y más bien un caso de esquina y su solución se adapta al 99% de los casos de uso.

en resumen: con su enfoque, el recurso gestionado por transacciones es la conexión. en mi PR, los recursos administrados son el mango.

Hay problemas relacionados con el uso de jdbi3 con stringtemplate4 y las importaciones de grupos. Ver mi problema https://github.com/jdbi/jdbi/issues/1052
Este problema también incluye un enlace a un esqueleto de repositorio completamente funcional para usar jdbi3 en Spring Boot 2.0.0

Cuando implemente @kaandok solución 's con la anotación @Transactional de primavera, consigo siguiente excepción debido al cierre de los mangos cuando existe transacciones abiertas. ¿Existe alguna solución recomendada / aplicable para eso?

"Se detectó un manejo incorrecto de transacciones: se cerró un identificador con una transacción abierta. Las transacciones deben confirmarse o deshacerse explícitamente antes de cerrar el identificador. Jdbi ha revertido esta transacción automáticamente".

@cengha, ¿ puede proporcionar algún código que demuestre su problema, por favor?

A continuación se muestra la clase de configuración:

<strong i="6">@Bean</strong>
public HikariDataSource hikariDataSource() {
    HikariConfig dataSourceConfig = new HikariConfig();
    dataSourceConfig.setDriverClassName(driverClassName);
    dataSourceConfig.setJdbcUrl(jdbcUrl);
    dataSourceConfig.setUsername(username);
    dataSourceConfig.setPassword(password);
    dataSourceConfig.setAutoCommit(true);
    return new HikariDataSource(dataSourceConfig);
}

<strong i="7">@Bean</strong>
public TransactionAwareDataSourceProxy transactionAwareDataSourceProxy(HikariDataSource dataSource) {
    return new TransactionAwareDataSourceProxy(dataSource);
}

<strong i="8">@Bean</strong>
public PlatformTransactionManager platformTransactionManager(HikariDataSource dataSource) {
    return new DataSourceTransactionManager(dataSource);
}

<strong i="9">@Bean</strong>
public Jdbi jdbi(TransactionAwareDataSourceProxy transactionAwareDataSourceProxy) {
    Jdbi jdbi = Jdbi.create(transactionAwareDataSourceProxy);
    jdbi.installPlugin(new SqlObjectPlugin());
    return jdbi;
}

Aquí está la capa de servicio

    <strong i="13">@Override</strong>
    <strong i="14">@Transactional</strong>
    public Long createX(X x) {
        Long aLong = XDao.insertX(x);
        if(true) throw new RuntimeException();
        return aLong;
    }

Cuando la confirmación automática se establece en falso, se menciona el error de transacción, pero si se establece en verdadero, no hay ningún error de transacción, pero esta vez la reversión no funciona (después de la excepción de tiempo de ejecución) y, por lo tanto, el objeto X se persiste en la base de datos. Yo uso Spring 2.0.3, JDBI 3.0.0-beta2.

Problema resuelto. Estaba usando una versión anterior de JDBI, después de notar que este hilo actualizó la biblioteca y todo se resolvió.

¿Fue útil esta página
0 / 5 - 0 calificaciones