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?
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 claseHikariDataSource
. 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 agetConnection()
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.