es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Cierre del origen de datos de la conexión del problema.

Tengo una fuente de datos que se configura y luego se utiliza por un software de terceros para ejecutar SQL. Después de que se ejecuta el SQL, tengo otro objeto que se encarga de ejecutar y cerrar la conexión.

@Bean
public DataSource datasource() {
    HikariConfig myconfig = new HikariConfig();
    ...
    return new HikariDataSource(myconfig);
}

@Bean
@DependsOn("sqlproject")
public void closeConnection() throws SQLException {
    Connection c = datasource().getConnection();
    try {
        c.close();
    } 
    finally {
        System.out.println(c.isClosed());
    }
}

Sin embargo, claramente todavía puedo hacer llamadas locales utilizando la conexión de la fuente de datos a datos particulares. ¿No debería llamar a datasource() porque esto crea una nueva instancia? ¿Qué estoy haciendo mal?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que puede estar experimentando cierta confusión en torno al uso del método datasource() en su código.

    En primer lugar, es importante entender que cada vez que llama al método datasource(), se creará una nueva instancia de la clase HikariDataSource. Por lo tanto, si está llamando a este método varias veces en su código, está creando varios grupos de conexión y potencialmente desperdiciando recursos.

    Para evitar esto, debe considerar la creación de una única instancia del objeto HikariDataSource e inyectarlo donde sea necesario en su código (por ejemplo, a través de la inyección de constructor o setter). De esta manera, puede garantizar que todas las partes de su código estén utilizando el mismo grupo de conexión.

    En cuanto a su pregunta específica sobre la posibilidad de hacer llamadas locales utilizando la conexión de datos: esto es probablemente porque el objeto HikariDataSource está diseñado para administrar un grupo de conexiones, en lugar de una única conexión. Por lo tanto, incluso si llama a getConnection() varias veces, aún puede estar utilizando la misma conexión física del grupo (dependiendo de la configuración del grupo).

    Si necesita asegurarse de que no se estén utilizando conexiones fuera del contexto específico donde se necesitan, podría considerar el uso de algún tipo de framework de gestión de transacciones (como Spring Transaction Management) para garantizar que las conexiones se abran y cierren correctamente dentro de un ámbito de transacción definido.

    En resumen, para evitar los problemas que está experimentando, considere crear una única instancia de la clase HikariDataSource e inyectarla donde sea necesario en su código. Y si necesita limitar el uso de conexiones a un contexto o transacción específicos, considere el uso de un framework de gestión de transacciones.

Comments are closed.