From c0e9c52fbd6b4675b253ad2dd2cad38c3d8ac322 Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 15 Jul 2013 22:32:14 +0800 Subject: [PATCH 1/4] add exception sorter --- .../alibaba/druid/pool/DruidDataSource.java | 7 +++-- .../druid/pool/vendor/DB2ExceptionSorter.java | 27 +++++++++++++++++++ 2 files changed, 32 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 959f5826b0..93037037e4 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -54,6 +54,7 @@ import com.alibaba.druid.filter.FilterChainImpl; import com.alibaba.druid.mock.MockDriver; import com.alibaba.druid.pool.DruidPooledPreparedStatement.PreparedStatementKey; +import com.alibaba.druid.pool.vendor.DB2ExceptionSorter; import com.alibaba.druid.pool.vendor.InformixExceptionSorter; import com.alibaba.druid.pool.vendor.MSSQLValidConnectionChecker; import com.alibaba.druid.pool.vendor.MockExceptionSorter; @@ -853,9 +854,9 @@ private void initValidConnectionChecker() { private void initExceptionSorter() { String realDriverClassName = driver.getClass().getName(); - if (realDriverClassName.equals("com.mysql.jdbc.Driver")) { + if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER)) { this.exceptionSorter = new MySqlExceptionSorter(); - } else if (realDriverClassName.equals("oracle.jdbc.driver.OracleDriver")) { + } else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)) { this.exceptionSorter = new OracleExceptionSorter(); } else if (realDriverClassName.equals("com.informix.jdbc.IfxDriver")) { this.exceptionSorter = new InformixExceptionSorter(); @@ -865,6 +866,8 @@ private void initExceptionSorter() { } else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) { this.exceptionSorter = new MockExceptionSorter(); + } else if (realDriverClassName.equals(JdbcConstants.DB2_DRIVER)) { + this.exceptionSorter = new DB2ExceptionSorter(); } } diff --git a/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java new file mode 100644 index 0000000000..9660550527 --- /dev/null +++ b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java @@ -0,0 +1,27 @@ +package com.alibaba.druid.pool.vendor; + +import java.sql.SQLException; +import java.util.Properties; + +import com.alibaba.druid.pool.ExceptionSorter; + +public class DB2ExceptionSorter implements ExceptionSorter { + + @Override + public boolean isExceptionFatal(SQLException e) { + int errorCode = e.getErrorCode(); + switch (errorCode) { // THE CURSOR IS NOT IN A PREPARED STATE + case -514: + return true; + default: + break; + } + return false; + } + + @Override + public void configFromProperties(Properties properties) { + + } + +} From 8a26dfb2acc2ea50363314198621a62cd0776e4d Mon Sep 17 00:00:00 2001 From: wenshao Date: Mon, 15 Jul 2013 23:02:21 +0800 Subject: [PATCH 2/4] add license info --- .../druid/pool/vendor/DB2ExceptionSorter.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java index 9660550527..f39aa27056 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java @@ -1,3 +1,18 @@ +/* + * Copyright 1999-2011 Alibaba Group Holding Ltd. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package com.alibaba.druid.pool.vendor; import java.sql.SQLException; From 6349070119c9974d7a6bfa8bafe49bb3a4f12a6c Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 16 Jul 2013 08:21:00 +0800 Subject: [PATCH 3/4] improve DB2ExceptionSorter --- .../druid/pool/vendor/DB2ExceptionSorter.java | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java index f39aa27056..674c183741 100644 --- a/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java +++ b/src/main/java/com/alibaba/druid/pool/vendor/DB2ExceptionSorter.java @@ -24,9 +24,22 @@ public class DB2ExceptionSorter implements ExceptionSorter { @Override public boolean isExceptionFatal(SQLException e) { + String sqlState = e.getSQLState(); + if (sqlState != null && sqlState.startsWith("08")) { // Connection Exception + return true; + } + int errorCode = e.getErrorCode(); - switch (errorCode) { // THE CURSOR IS NOT IN A PREPARED STATE - case -514: + switch (errorCode) { + case -512: // STATEMENT REFERENCE TO REMOTE OBJECT IS INVALID + case -514: // THE CURSOR IS NOT IN A PREPARED STATE + case -516: // THE DESCRIBE STATEMENT DOES NOT SPECIFY A PREPARED STATEMENT + case -518: // THE EXECUTE STATEMENT DOES NOT IDENTIFY A VALID PREPARED STATEMENT + case -525: // THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE IT WAS IN ERROR AT BIND TIME FOR SECTION = sectno + // PACKAGE = pkgname CONSISTENCY TOKEN = contoken + case -909: // THE OBJECT HAS BEEN DELETED OR ALTERED + case -918: // THE SQL STATEMENT CANNOT BE EXECUTED BECAUSE A CONNECTION HAS BEEN LOST + case -924: // DB2 CONNECTION INTERNAL ERROR, function-code,return-code,reason-code return true; default: break; From 34d07a9c269d547c9593616cf6776cb8998fac9e Mon Sep 17 00:00:00 2001 From: wenshao Date: Tue, 16 Jul 2013 21:35:43 +0800 Subject: [PATCH 4/4] DB2ExceptionSorter --- src/main/java/com/alibaba/druid/pool/DruidDataSource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java index 93037037e4..e1f832f49f 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidDataSource.java @@ -866,7 +866,7 @@ private void initExceptionSorter() { } else if (realDriverClassName.equals("com.alibaba.druid.mock.MockDriver")) { this.exceptionSorter = new MockExceptionSorter(); - } else if (realDriverClassName.equals(JdbcConstants.DB2_DRIVER)) { + } else if (realDriverClassName.contains("DB2")) { this.exceptionSorter = new DB2ExceptionSorter(); } }