diff --git a/casic-metering-common/src/main/java/com/casic/missiles/config/druid/BusDruidDataSource.java b/casic-metering-common/src/main/java/com/casic/missiles/config/druid/BusDruidDataSource.java index 236d51a..118811f 100644 --- a/casic-metering-common/src/main/java/com/casic/missiles/config/druid/BusDruidDataSource.java +++ b/casic-metering-common/src/main/java/com/casic/missiles/config/druid/BusDruidDataSource.java @@ -1,6 +1,8 @@ package com.casic.missiles.config.druid; import com.alibaba.druid.pool.DruidDataSource; +import com.alibaba.druid.pool.DruidPooledConnection; +import lombok.extern.slf4j.Slf4j; import java.sql.Connection; import java.sql.DriverManager; @@ -11,57 +13,70 @@ * @Author: wangpeng * @Date: 2023/6/16 18:04 */ +@Slf4j public class BusDruidDataSource extends DruidDataSource { - private boolean lastInited; + private boolean lastInited; - private String[] urls; + private String[] urls; - public String[] getUrls() { - return urls; + public String[] getUrls() { + return urls; + } + + public void setUrls(String[] urls) { + this.urls = urls; + } + + @Override + public void init() throws SQLException { + lastInited = inited; + super.init(); + if (!lastInited && inited) { + new Thread(new ValidateUrlTask()).start(); } + } - public void setUrls(String[] urls) { - this.urls = urls; + private boolean isDatabaseAvailable() { + try { + DruidPooledConnection connection = this.getConnection(10000); + connection.nativeSQL("SELECT 1"); + // 如果查询成功,则返回 true,说明数据库可用 + return true; + } catch (SQLException e) { + // 发生异常,则返回 false,说明数据库不可用 + return false; } + } + class ValidateUrlTask implements Runnable { @Override - public void init() throws SQLException { - lastInited = inited; - super.init(); - if (!lastInited && inited) { - new Thread(new ValidateUrlTask()).start(); - } - } - - class ValidateUrlTask implements Runnable { - @Override - public void run() { - while (true) { - //如果整个数据源被关闭了,就结束这个定时任务 - if (isClosed()) { - break; - } - //如果这个数据源已经被初始化了,同时连接异常才进行处理 - if (isInited() && isFailContinuous()) { - for (String thisUrl : urls) { - Connection connection = null; + public void run() { + while (true) { + //如果整个数据源被关闭了,就结束这个定时任务 + if (isClosed()) { + break; + } + //如果这个数据源已经被初始化了,同时连接异常才进行处理 + if (isInited() && !isDatabaseAvailable()) { + for (String thisUrl : urls) { + Connection connection = null; + try { + connection = DriverManager.getConnection(thisUrl, username, password); + jdbcUrl = thisUrl; + } catch (Exception ignored) { + } finally { try { - connection = DriverManager.getConnection(thisUrl, username, password); - jdbcUrl = thisUrl; + connection.close(); } catch (Exception ignored) { - } finally { - try { - connection.close(); - } catch (Exception ignored) { - } } } } - try { - Thread.sleep(5000); //5秒执行一次while - } catch (InterruptedException ignored) { - } + } + try { + Thread.sleep(5000); //5秒执行一次while + } catch (InterruptedException ignored) { } } } + } }