diff --git a/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java b/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java index bb138e9087..659d40b344 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/MySqlExceptionSorter.java @@ -17,6 +17,9 @@ package com.alibaba.druid.pool.vendor; import com.alibaba.druid.pool.ExceptionSorter; +import java.io.IOException; +import java.net.SocketException; +import java.net.SocketTimeoutException; import java.sql.SQLException; import java.sql.SQLRecoverableException; import java.util.Properties; @@ -70,8 +73,7 @@ public class MySqlExceptionSorter implements ExceptionSorter { } String className = e.getClass().getName(); - if ("com.mysql.jdbc.CommunicationsException".equals(className) - || "com.mysql.jdbc.exceptions.jdbc4.CommunicationsException".equals(className)) { + if (className.endsWith(".CommunicationsException")) { return true; } @@ -91,7 +93,20 @@ public class MySqlExceptionSorter implements ExceptionSorter { return true; } } - + + Throwable cause = e.getCause(); + for (int i = 0; i < 5 && cause != null; ++i) { + if (cause instanceof SocketTimeoutException || cause instanceof IOException) { + return true; + } + + className = cause.getClass().getName(); + if (className.endsWith(".CommunicationsException")) { + return true; + } + + cause = cause.getCause(); + } return false; } diff --git a/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_1.java b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_1.java new file mode 100644 index 0000000000..7148054c11 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_1.java @@ -0,0 +1,24 @@ +package com.alibaba.druid.bvt.pool.vendor; + +import com.alibaba.druid.pool.vendor.MySqlExceptionSorter; +import com.mysql.jdbc.CommunicationsException; +import junit.framework.TestCase; + +import java.sql.SQLException; + +/** + * Created by wenshao on 18/07/2017. + */ +public class MySqlExceptionSorterTest_1 extends TestCase { + public void test_0() throws Exception { + MySqlExceptionSorter sorter = new MySqlExceptionSorter(); + + SQLException rootException = new SQLException( + new SQLException("Could not retrieve transation read-only status server", + new CommunicationsException(null, 0, 0, null) + ) + ); + + assertTrue(sorter.isExceptionFatal(rootException)); + } +} diff --git a/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_2.java b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_2.java new file mode 100644 index 0000000000..6894fd44c0 --- /dev/null +++ b/src/test/java/com/alibaba/druid/bvt/pool/vendor/MySqlExceptionSorterTest_2.java @@ -0,0 +1,25 @@ +package com.alibaba.druid.bvt.pool.vendor; + +import com.alibaba.druid.pool.vendor.MySqlExceptionSorter; +import com.mysql.jdbc.CommunicationsException; +import junit.framework.TestCase; + +import java.net.SocketTimeoutException; +import java.sql.SQLException; + +/** + * Created by wenshao on 18/07/2017. + */ +public class MySqlExceptionSorterTest_2 extends TestCase { + public void test_0() throws Exception { + MySqlExceptionSorter sorter = new MySqlExceptionSorter(); + + SQLException rootException = new SQLException( + new SQLException("Could not retrieve transation read-only status server", + new SocketTimeoutException() + ) + ); + + assertTrue(sorter.isExceptionFatal(rootException)); + } +}