在运行时更改数据库如何刷新 JdbcTemplate bean 的数据源?

问题描述

我有以下问题: 我目前正在编写一个 Spring Boot 应用程序,它提供了一个休息端点,并不断评估存储在我必须通过 SSH 隧道 访问的远程 MysqL 数据库中的一些数据。我使用 Jcraft 库来创建该隧道并动态分配一个空闲端口,我的数据源使用该端口通过隧道连接到数据库。端口不能是静态的。

数据源本身是一个Hikari 连接池

偶尔发生一些事情,我失去与数据库的连接。 我想创建一个故障保护,它基本上可以捕获与数据库通信的任何问题相关的任何异常,自动关闭旧隧道 + 数据源,然后创建一个新隧道 + 重新创建数据源。

我目前的方法如下:

基本上只是重新创建隧道,因为它不再存在,然后关闭连接池+再次重新启动它。之后,我在 DAO 内部自动装配的每个 JdbcTemplate 中设置了新数据源。

我的数据源配置 bean:

import com.jcraft.jsch.JSchException;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import net.candidatis.tiertwo.data.*;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.concurrent.TimeUnit;

@Slf4j
@Configuration
@Data
public class ConfigDataSource {

HikariDataSource ds;
private SshSession sshSession;
private DaoCustom daoCustom;
private DaoPortals daoPortals;
private DaoBlacklist daoBlacklist;
private DaoDbChecker daoDbChecker;
private DaoPublishing daoPublishing;
private DaoTempJobs daoTempJobs;

public ConfigDataSource(SshSession sshSession){
    this.sshSession = sshSession;
}

@Bean
public HikariDataSource dataSource(){
    ds = new HikariDataSource(getConfig());
    return ds;
}

public void reloadDataSource(){
    log.info("Reloading the Connection pool.");
    if(ds != null && !ds.isClosed()){
        ds.close();
    }
    ds = new HikariDataSource(getConfig());

    this.daoCustom.getJdbcTemplate().setDataSource(ds);
    this.daoPortals.getJdbcTemplate().setDataSource(ds);
    this.daoBlacklist.getJdbcTemplate().setDataSource(ds);;
    this.daoDbChecker.getJdbcTemplate().setDataSource(ds);
    this.daoPublishing.getJdbcTemplate().setDataSource(ds);
    this.daoPublishing.getNamedJdbcTemplate().getJdbcTemplate().setDataSource(ds);
    this.daoTempJobs.getJdbcTemplate().setDataSource(ds);
}

private HikariConfig getConfig(){
    try {
        this.sshSession.createSessionSSH();
    } catch (JSchException e) {
        e.printstacktrace();
        log.error("Could not create SSH session");
    }

    HikariConfig config = new HikariConfig();

    config.setJdbcUrl( Constants.DB_JDBC_URL + this.sshSession.getAssignedPort());
    config.setUsername( Constants.DB_USER );
    config.setPassword( Constants.DB_PASSWORD );

    config.setMaximumPoolSize(2);
    config.setMaxLifetime(TimeUnit.MINUTES.toMillis(5)); // default wait_timeout of MysqL = 28800 seconds = 8 hours -> must be less
    config.setConnectionTimeout(TimeUnit.MINUTES.toMillis(10)); // Maximum number of milliseconds that a client will wait for a connection from the pool. Throws sqlException
    config.setValidationTimeout(TimeUnit.MINUTES.toMillis(8)); // This property controls the maximum amount of time that a connection will be tested for aliveness.
    config.setLeakDetectionThreshold(30000);

    return config;
}

}

如果发生任何事情,异常处理基本上只是 reloadDataSource 方法。 它使用具有新分配端口的配置创建一个新池,并更新所有 JdbcTemplate 类的所有数据源..

它几乎有效。我可以重新加载池,然后我可以在数据库上使用 SELECT 语句来获取数据,但是我似乎无法插入、更新或删除数据。

这是我的hikariCP日志的一部分在启动时(不重新加载):

2021-03-31 13:18:05.051 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.util.DriverDataSource  : Loaded driver with class name com.MysqL.cj.jdbc.Driver for jdbcUrl=jdbc:MysqL://localhost:41749
2021-03-31 13:18:05.566 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.MysqL.cj.jdbc.ConnectionImpl@647dd875
2021-03-31 13:18:05.566  INFO 471740 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-03-31 13:18:05.666 DEBUG 471740 --- [l-1 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Pool stats (total=1,active=1,idle=0,waiting=0)
2021-03-31 13:18:05.714 DEBUG 471740 --- [onnection adder] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Added connection com.MysqL.cj.jdbc.ConnectionImpl@1c9d2fe4
2021-03-31 13:18:05.714 DEBUG 471740 --- [onnection adder] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - After adding stats (total=2,idle=1,waiting=0)

..重新加载后再次出现:

2021-03-31 13:18:24.808  INFO 471740 --- [  restartedMain] n.c.tiertwo.config.ConfigDataSource      : Reloading the Connection pool.
2021-03-31 13:18:24.808  INFO 471740 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown initiated...
2021-03-31 13:18:24.809 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - Before shutdown stats (total=2,active=0,idle=2,waiting=0)
2021-03-31 13:18:24.809 DEBUG 471740 --- [nnection closer] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Closing connection com.MysqL.cj.jdbc.ConnectionImpl@647dd875: (connection evicted)
2021-03-31 13:18:24.812 DEBUG 471740 --- [nnection closer] com.zaxxer.hikari.pool.PoolBase          : HikariPool-1 - Closing connection com.MysqL.cj.jdbc.ConnectionImpl@1c9d2fe4: (connection evicted)
2021-03-31 13:18:24.812 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-1 - After shutdown stats (total=0,waiting=0)
2021-03-31 13:18:24.812  INFO 471740 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Shutdown completed.
2021-03-31 13:18:34.946  INFO 471740 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Starting...
2021-03-31 13:18:34.946 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.util.DriverDataSource  : Loaded driver with class name com.MysqL.cj.jdbc.Driver for jdbcUrl=jdbc:MysqL://localhost:35177
2021-03-31 13:18:35.691 DEBUG 471740 --- [  restartedMain] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Added connection com.MysqL.cj.jdbc.ConnectionImpl@153f9ff2
2021-03-31 13:18:35.692  INFO 471740 --- [  restartedMain] com.zaxxer.hikari.HikariDataSource       : HikariPool-2 - Start completed.
2021-03-31 13:18:35.710  INFO 471740 --- [  restartedMain] n.c.tiertwo.controllers.MainController   : Fetching TempJob Block from database
2021-03-31 13:18:35.792 DEBUG 471740 --- [l-2 housekeeper] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Pool stats (total=1,waiting=0)
2021-03-31 13:18:35.978 DEBUG 471740 --- [onnection adder] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - Added connection com.MysqL.cj.jdbc.ConnectionImpl@22eb1758
2021-03-31 13:18:35.978 DEBUG 471740 --- [onnection adder] com.zaxxer.hikari.pool.HikariPool        : HikariPool-2 - After adding stats (total=2,waiting=0)

再说一次:我可以使用 SELECT 语句,因此该池应该确实存在。但是,在插入、删除或任何其他查询时,我收到以下错误

    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:86)
    at org.springframework.jdbc.core.Metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:171)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:277)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:261)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecuteAndReturnKey(AbstractJdbcInsert.java:368)
    at org.springframework.jdbc.core.simple.SimpleJdbcInsert.executeAndReturnKey(SimpleJdbcInsert.java:127)
    at net.candidatis.tiertwo.data.DaoPublishing.publish(DaoPublishing.java:220)
    at net.candidatis.tiertwo.data.DaoPublishing$$FastClassBySpringcglib$$32c38d56.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:771)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.aop.framework.cglibAopProxy$DynamicAdvisedInterceptor.intercept(cglibAopProxy.java:691)
    at net.candidatis.tiertwo.data.DaoPublishing$$EnhancerBySpringcglib$$bdbc3342.publish(<generated>)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:150)
    at net.candidatis.tiertwo.services.Publisher.publishEvaluation(Publisher.java:67)
    at net.candidatis.tiertwo.services.Publishing.run(Publishing.java:16)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:363)
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:52)
    ... 25 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:337)
    ... 26 more
Caused by: java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    ... 27 more
org.springframework.dao.DataAccessResourceFailureException: Error retrieving database Meta-data; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:86)
    at org.springframework.jdbc.core.Metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:171)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:277)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:261)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecuteAndReturnKey(AbstractJdbcInsert.java:368)
    at org.springframework.jdbc.core.simple.SimpleJdbcInsert.executeAndReturnKey(SimpleJdbcInsert.java:127)
    at net.candidatis.tiertwo.data.DaoPublishing.publish(DaoPublishing.java:220)
    at net.candidatis.tiertwo.data.DaoPublishing$$FastClassBySpringcglib$$32c38d56.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:771)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.aop.framework.cglibAopProxy$DynamicAdvisedInterceptor.intercept(cglibAopProxy.java:691)
    at net.candidatis.tiertwo.data.DaoPublishing$$EnhancerBySpringcglib$$bdbc3342.publish(<generated>)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:150)
    at net.candidatis.tiertwo.services.Publisher.publishEvaluation(Publisher.java:67)
    at net.candidatis.tiertwo.services.Publishing.run(Publishing.java:16)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:363)
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:52)
    ... 25 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:337)
    ... 26 more
Caused by: java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    ... 27 more
org.springframework.dao.DataAccessResourceFailureException: Error retrieving database Meta-data; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:86)
    at org.springframework.jdbc.core.Metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:171)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:277)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:261)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecuteAndReturnKey(AbstractJdbcInsert.java:368)
    at org.springframework.jdbc.core.simple.SimpleJdbcInsert.executeAndReturnKey(SimpleJdbcInsert.java:127)
    at net.candidatis.tiertwo.data.DaoPublishing.publish(DaoPublishing.java:220)
    at net.candidatis.tiertwo.data.DaoPublishing$$FastClassBySpringcglib$$32c38d56.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:771)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.aop.framework.cglibAopProxy$DynamicAdvisedInterceptor.intercept(cglibAopProxy.java:691)
    at net.candidatis.tiertwo.data.DaoPublishing$$EnhancerBySpringcglib$$bdbc3342.publish(<generated>)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:150)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:171)
    at net.candidatis.tiertwo.services.Publisher.publishEvaluation(Publisher.java:67)
    at net.candidatis.tiertwo.services.Publishing.run(Publishing.java:16)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:363)
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:52)
    ... 26 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:337)
    ... 27 more
Caused by: java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    ... 28 more
org.springframework.dao.DataAccessResourceFailureException: Error retrieving database Meta-data; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:86)
    at org.springframework.jdbc.core.Metadata.TableMetaDataContext.processMetaData(TableMetaDataContext.java:171)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compileInternal(AbstractJdbcInsert.java:277)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.compile(AbstractJdbcInsert.java:261)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.checkCompiled(AbstractJdbcInsert.java:309)
    at org.springframework.jdbc.core.simple.AbstractJdbcInsert.doExecuteAndReturnKey(AbstractJdbcInsert.java:368)
    at org.springframework.jdbc.core.simple.SimpleJdbcInsert.executeAndReturnKey(SimpleJdbcInsert.java:127)
    at net.candidatis.tiertwo.data.DaoPublishing.publish(DaoPublishing.java:220)
    at net.candidatis.tiertwo.data.DaoPublishing$$FastClassBySpringcglib$$32c38d56.invoke(<generated>)
    at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.invokeJoinpoint(cglibAopProxy.java:771)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
    at org.springframework.aop.framework.cglibAopProxy$cglibMethodInvocation.proceed(cglibAopProxy.java:749)
    at org.springframework.aop.framework.cglibAopProxy$DynamicAdvisedInterceptor.intercept(cglibAopProxy.java:691)
    at net.candidatis.tiertwo.data.DaoPublishing$$EnhancerBySpringcglib$$bdbc3342.publish(<generated>)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:150)
    at net.candidatis.tiertwo.services.Publisher.publish(Publisher.java:171)
    at net.candidatis.tiertwo.services.Publisher.publishEvaluation(Publisher.java:67)
    at net.candidatis.tiertwo.services.Publishing.run(Publishing.java:16)
    at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
    at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Could not get Connection for extracting Meta-data; nested exception is org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:363)
    at org.springframework.jdbc.core.Metadata.TableMetaDataProviderFactory.createMetaDataProvider(TableMetaDataProviderFactory.java:52)
    ... 26 more
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Failed to obtain JDBC Connection; nested exception is java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:82)
    at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:337)
    ... 27 more
Caused by: java.sql.sqlException: HikariDataSource HikariDataSource (HikariPool-1) has been closed.
    at com.zaxxer.hikari.HikariDataSource.getConnection(HikariDataSource.java:96)
    at org.springframework.jdbc.datasource.DataSourceUtils.fetchConnection(DataSourceUtils.java:158)
    at org.springframework.jdbc.datasource.DataSourceUtils.doGetConnection(DataSourceUtils.java:116)
    at org.springframework.jdbc.datasource.DataSourceUtils.getConnection(DataSourceUtils.java:79)
    ... 28 more

如您所见,它仍在尝试使用 HikariPool #1 实际上应该使用我之前设置的新 #2。

任何想法为什么它会这样?会不会是 Spring 容器提供的 jdbcTemplate 的数据源一经初始化就无法切换?如果我不能改变它为什么我可以使用 SELECT 查询?通常是否有更好的方法来全局更新我所有数据库操作的数据源?我真的需要为这些数据库连接问题找到可靠的解决方案。

谢谢你的一切。

感谢您的帮助。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)