From 9b72b46fb80add4b49d389ca3b71c65cbbf6161d Mon Sep 17 00:00:00 2001 From: linghengqian Date: Wed, 25 Sep 2024 23:59:20 +0800 Subject: [PATCH] Add property `closeConnOnFatalError` to match HikariCP's behavior --- .../java/com/alibaba/druid/pool/DruidDataSource.java | 11 ++++++++++- .../com/alibaba/druid/util/DruidDataSourceUtils.java | 1 + .../alibaba/druid/util/DruidDataSourceUtilsTest.java | 3 +++ 3 files changed, 14 insertions(+), 1 deletion(-) diff --git a/core/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/core/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 4d58d620865..2879f4fcb5a 100644 --- a/core/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/core/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -147,6 +147,7 @@ public class DruidDataSource extends DruidAbstractDataSource private boolean asyncInit; protected boolean killWhenSocketReadTimeout; protected boolean checkExecuteTime; + protected boolean closeConnOnFatalError = true; private static List autoFilters; private boolean loadSpifilterSkip; @@ -185,6 +186,14 @@ public void setAsyncInit(boolean asyncInit) { this.asyncInit = asyncInit; } + public boolean isCloseConnOnFatalError() { + return closeConnOnFatalError; + } + + public void setCloseConnOnFatalError(boolean closeConnOnFatalError) { + this.closeConnOnFatalError = closeConnOnFatalError; + } + @Deprecated public void configFromPropety(Properties properties) { configFromPropeties(properties); @@ -1640,7 +1649,7 @@ protected final void handleFatalError( ReentrantLock fatalErrorCountLock = hasHolderDataSource ? holder.getDataSource().lock : conn.lock; fatalErrorCountLock.lock(); try { - if ((!conn.closed) && !conn.disable) { + if ((!conn.closed) && !conn.disable && isCloseConnOnFatalError()) { conn.disable(error); requireDiscard = true; } diff --git a/core/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java b/core/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java index ae249162e84..3f61a0154ea 100644 --- a/core/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java +++ b/core/src/main/java/com/alibaba/druid/util/DruidDataSourceUtils.java @@ -326,5 +326,6 @@ public static void configFromProperties(DruidDataSource druidDataSource, Propert trySetIntProperty(properties, "druid.socketTimeout", druidDataSource::setSocketTimeout); trySetIntProperty(properties, "druid.transactionQueryTimeout", druidDataSource::setTransactionQueryTimeout); trySetIntProperty(properties, "druid.loginTimeout", druidDataSource::setLoginTimeout); + trySetBooleanProperty(properties, "druid.closeConnOnFatalError", druidDataSource::setCloseConnOnFatalError); } } diff --git a/core/src/test/java/com/alibaba/druid/util/DruidDataSourceUtilsTest.java b/core/src/test/java/com/alibaba/druid/util/DruidDataSourceUtilsTest.java index bb3c4993298..179ae7c16d2 100644 --- a/core/src/test/java/com/alibaba/druid/util/DruidDataSourceUtilsTest.java +++ b/core/src/test/java/com/alibaba/druid/util/DruidDataSourceUtilsTest.java @@ -396,6 +396,8 @@ public void testConfigFromProperties() { properties.put("druid.disableException", druidDisableException); String druidInstanceKey = "@lizongbo"; properties.put("druid.instanceKey", druidInstanceKey); + String druidCloseConnOnFatalError = "false"; + properties.put("druid.closeConnOnFatalError", druidCloseConnOnFatalError); DruidDataSource dataSource = new DruidDataSource(); dataSource.configFromPropeties(properties); @@ -455,6 +457,7 @@ public void testConfigFromProperties() { assertEquals(druidKillWhenSocketReadTimeout, String.valueOf(dataSource.isKillWhenSocketReadTimeout())); //assertEquals(druidCheckExecuteTime, String.valueOf(dataSource.isCheckExecuteTime())); //assertEquals(druidLoadSpifilterSkip, String.valueOf(dataSource.isLoadSpifilterSkip())); + assertEquals(druidCloseConnOnFatalError, String.valueOf(dataSource.isCloseConnOnFatalError())); } public void testGenTestCode() {