From c8fa957dbd39c4a588268691cba2d5ae52fe84b2 Mon Sep 17 00:00:00 2001 From: KomachiSion Date: Mon, 26 Sep 2022 14:49:40 +0800 Subject: [PATCH] For #8611, Close old datasource connection. --- .../ExternalDataSourceServiceImpl.java | 27 ++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/config/src/main/java/com/alibaba/nacos/config/server/service/datasource/ExternalDataSourceServiceImpl.java b/config/src/main/java/com/alibaba/nacos/config/server/service/datasource/ExternalDataSourceServiceImpl.java index 8ac97a99f56..ad31e6e3b55 100644 --- a/config/src/main/java/com/alibaba/nacos/config/server/service/datasource/ExternalDataSourceServiceImpl.java +++ b/config/src/main/java/com/alibaba/nacos/config/server/service/datasource/ExternalDataSourceServiceImpl.java @@ -119,16 +119,37 @@ public void init() { @Override public synchronized void reload() throws IOException { try { - dataSourceList = new ExternalDataSourceProperties() + final List testJtListNew = new ArrayList(); + final List isHealthListNew = new ArrayList(); + + List dataSourceListNew = new ExternalDataSourceProperties() .build(EnvUtil.getEnvironment(), (dataSource) -> { JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setQueryTimeout(queryTimeout); jdbcTemplate.setDataSource(dataSource); - testJtList.add(jdbcTemplate); - isHealthList.add(Boolean.TRUE); + testJtListNew.add(jdbcTemplate); + isHealthListNew.add(Boolean.TRUE); }); + + final List dataSourceListOld = dataSourceList; + final List testJtListOld = testJtList; + dataSourceList = dataSourceListNew; + testJtList = testJtListNew; + isHealthList = isHealthListNew; new SelectMasterTask().run(); new CheckDbHealthTask().run(); + + //close old datasource. + if (dataSourceListOld != null && !dataSourceListOld.isEmpty()) { + for (HikariDataSource dataSource : dataSourceListOld) { + dataSource.close(); + } + } + if (testJtListOld != null && !testJtListOld.isEmpty()) { + for (JdbcTemplate oldJdbc : testJtListOld) { + oldJdbc.setDataSource(null); + } + } } catch (RuntimeException e) { FATAL_LOG.error(DB_LOAD_ERROR_MSG, e); throw new IOException(e);