【问题标题】:Changing database during runtime. How can i refresh data source for JdbcTemplate bean?在运行时更改数据库。如何刷新 JdbcTemplate bean 的数据源?
【发布时间】:2021-03-31 12:54:59
【问题描述】:

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

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

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

我目前的做法如下:

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

我的数据源配置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, active=1, 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, active=0, idle=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, active=1, idle=0, 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, active=1, idle=1, waiting=0)

再次:我可以使用 SELECT 语句,因此池应该实际存在。但是在 INSERT、DELTE 或任何其他查询中,我收到以下错误:

    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 查询?通常有更好的方法来全局更新我所有数据库操作的数据源吗?我真的需要为这些数据库连接问题找到一个可靠的解决方案。

谢谢你。

感谢您的帮助。

【问题讨论】:

    标签: java spring-boot datasource jdbctemplate hikaricp


    【解决方案1】:

    看看@JonBates 的这个回答是否有帮助: https://stackoverflow.com/a/64375936/5917837

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-08-24
      • 1970-01-01
      • 2023-04-03
      • 2020-11-04
      • 1970-01-01
      • 2015-10-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多