You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@geode.apache.org by nr...@apache.org on 2018/03/01 21:47:37 UTC

[geode] branch develop updated: GEODE-4182: Add JdbcConnectorException (#1529)

This is an automated email from the ASF dual-hosted git repository.

nreich pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/geode.git


The following commit(s) were added to refs/heads/develop by this push:
     new e29f817  GEODE-4182: Add JdbcConnectorException (#1529)
e29f817 is described below

commit e29f8173a7ad62dcad26f88c7cf72dae34bb7274
Author: Nick Reich <nr...@pivotal.io>
AuthorDate: Thu Mar 1 13:47:33 2018 -0800

    GEODE-4182: Add JdbcConnectorException (#1529)
    
    
      * This runtime exception is used to warp failures in communication with
        an external database when using a JDBC data source
---
 .../geode/connectors/jdbc/JdbcAsyncWriter.java     |   3 +-
 ...rceFactory.java => JdbcConnectorException.java} |  22 ++++-
 .../apache/geode/connectors/jdbc/JdbcLoader.java   |   8 +-
 .../apache/geode/connectors/jdbc/JdbcWriter.java   |  24 +++--
 .../jdbc/internal/HikariJdbcDataSource.java        |   4 +-
 .../jdbc/internal/HikariJdbcDataSourceFactory.java |   2 +-
 .../geode/connectors/jdbc/internal/SqlHandler.java | 106 ++++++++-------------
 .../jdbc/internal/TableKeyColumnManager.java       |   6 +-
 .../geode/connectors/jdbc/JdbcAsyncWriterTest.java |   4 +-
 .../geode/connectors/jdbc/JdbcLoaderTest.java      |   2 +-
 .../geode/connectors/jdbc/JdbcWriterTest.java      |   6 +-
 .../connectors/jdbc/internal/SqlHandlerTest.java   |  16 ++--
 .../jdbc/internal/TableKeyColumnManagerTest.java   |   3 +-
 13 files changed, 105 insertions(+), 101 deletions(-)

diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriter.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriter.java
index 8f83ecb..9720882 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriter.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriter.java
@@ -14,6 +14,7 @@
  */
 package org.apache.geode.connectors.jdbc;
 
+import java.sql.SQLException;
 import java.util.List;
 import java.util.concurrent.atomic.AtomicLong;
 
@@ -68,7 +69,7 @@ public class JdbcAsyncWriter extends AbstractJdbcCallback implements AsyncEventL
           getSqlHandler().write(event.getRegion(), event.getOperation(), event.getKey(),
               getPdxInstance(event));
           changeSuccessfulEvents(1);
-        } catch (RuntimeException ex) {
+        } catch (SQLException | RuntimeException ex) {
           changeFailedEvents(1);
           logger.error("Exception processing event {}", event, ex);
         }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcConnectorException.java
similarity index 59%
copy from geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java
copy to geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcConnectorException.java
index 2bbd626..24674ea 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcConnectorException.java
@@ -12,10 +12,24 @@
  * or implied. See the License for the specific language governing permissions and limitations under
  * the License.
  */
-package org.apache.geode.connectors.jdbc.internal;
+package org.apache.geode.connectors.jdbc;
 
-public class HikariJdbcDataSourceFactory implements JdbcDataSourceFactory {
-  public JdbcDataSource create(ConnectionConfiguration configuration) {
-    return new HikariJdbcDataSource(configuration);
+import org.apache.geode.cache.CacheRuntimeException;
+
+/**
+ * An exception thrown when communication with an external JDBC data source fails and can be used
+ * to diagnose the cause of database communication failures.
+ *
+ * @since Geode 1.5
+ */
+public class JdbcConnectorException extends CacheRuntimeException {
+  private static final long serialVersionUID = 1L;
+
+  public JdbcConnectorException(Exception e) {
+    super(e);
+  }
+
+  public JdbcConnectorException(String message) {
+    super(message);
   }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcLoader.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcLoader.java
index f3ba9a5..bc380dd 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcLoader.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcLoader.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.connectors.jdbc;
 
+import java.sql.SQLException;
+
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.CacheLoader;
 import org.apache.geode.cache.CacheLoaderException;
@@ -49,6 +51,10 @@ public class JdbcLoader<K, V> extends AbstractJdbcCallback implements CacheLoade
     // The following cast to V is to keep the compiler happy
     // but is erased at runtime and no actual cast happens.
     checkInitialized((InternalCache) helper.getRegion().getRegionService());
-    return (V) getSqlHandler().read(helper.getRegion(), helper.getKey());
+    try {
+      return (V) getSqlHandler().read(helper.getRegion(), helper.getKey());
+    } catch (SQLException e) {
+      throw new JdbcConnectorException(e);
+    }
   }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcWriter.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcWriter.java
index c901d3d..72ba298 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcWriter.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/JdbcWriter.java
@@ -14,6 +14,8 @@
  */
 package org.apache.geode.connectors.jdbc;
 
+import java.sql.SQLException;
+
 import org.apache.geode.CopyHelper;
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.CacheWriter;
@@ -48,23 +50,17 @@ public class JdbcWriter<K, V> extends AbstractJdbcCallback implements CacheWrite
 
   @Override
   public void beforeUpdate(EntryEvent<K, V> event) throws CacheWriterException {
-    checkInitialized((InternalCache) event.getRegion().getRegionService());
-    getSqlHandler().write(event.getRegion(), event.getOperation(), event.getKey(),
-        getPdxNewValue(event));
+    writeEvent(event);
   }
 
   @Override
   public void beforeCreate(EntryEvent<K, V> event) throws CacheWriterException {
-    checkInitialized((InternalCache) event.getRegion().getRegionService());
-    getSqlHandler().write(event.getRegion(), event.getOperation(), event.getKey(),
-        getPdxNewValue(event));
+    writeEvent(event);
   }
 
   @Override
   public void beforeDestroy(EntryEvent<K, V> event) throws CacheWriterException {
-    checkInitialized((InternalCache) event.getRegion().getRegionService());
-    getSqlHandler().write(event.getRegion(), event.getOperation(), event.getKey(),
-        getPdxNewValue(event));
+    writeEvent(event);
   }
 
   @Override
@@ -77,6 +73,16 @@ public class JdbcWriter<K, V> extends AbstractJdbcCallback implements CacheWrite
     // this event is not sent to JDBC
   }
 
+  private void writeEvent(EntryEvent<K, V> event) {
+    checkInitialized((InternalCache) event.getRegion().getRegionService());
+    try {
+      getSqlHandler().write(event.getRegion(), event.getOperation(), event.getKey(),
+          getPdxNewValue(event));
+    } catch (SQLException e) {
+      throw new JdbcConnectorException(e);
+    }
+  }
+
   private PdxInstance getPdxNewValue(EntryEvent<K, V> event) {
     DefaultQuery.setPdxReadSerialized(true);
     try {
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSource.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSource.java
index 62a1261..188d3d9 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSource.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSource.java
@@ -19,11 +19,11 @@ import java.sql.SQLException;
 
 import com.zaxxer.hikari.HikariDataSource;
 
-public class HikariJdbcDataSource implements JdbcDataSource {
+class HikariJdbcDataSource implements JdbcDataSource {
 
   private final HikariDataSource delegate;
 
-  public HikariJdbcDataSource(ConnectionConfiguration config) {
+  HikariJdbcDataSource(ConnectionConfiguration config) {
     HikariDataSource ds = new HikariDataSource();
     ds.setJdbcUrl(config.getUrl());
     ds.setUsername(config.getUser());
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java
index 2bbd626..a3e9a60 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/HikariJdbcDataSourceFactory.java
@@ -14,7 +14,7 @@
  */
 package org.apache.geode.connectors.jdbc.internal;
 
-public class HikariJdbcDataSourceFactory implements JdbcDataSourceFactory {
+class HikariJdbcDataSourceFactory implements JdbcDataSourceFactory {
   public JdbcDataSource create(ConnectionConfiguration configuration) {
     return new HikariJdbcDataSource(configuration);
   }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
index 25a3694..61d85f2 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/SqlHandler.java
@@ -26,10 +26,10 @@ import java.util.List;
 import org.apache.geode.annotations.Experimental;
 import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.Region;
+import org.apache.geode.connectors.jdbc.JdbcConnectorException;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.pdx.PdxInstance;
 import org.apache.geode.pdx.PdxInstanceFactory;
-import org.apache.geode.pdx.internal.PdxInstanceImpl;
 
 @Experimental
 public class SqlHandler {
@@ -52,15 +52,11 @@ public class SqlHandler {
     manager.close();
   }
 
-  Connection getConnection(ConnectionConfiguration config) {
-    try {
-      return manager.getDataSource(config).getConnection();
-    } catch (SQLException e) {
-      throw new IllegalStateException("Could not connect to " + config.getUrl(), e);
-    }
+  Connection getConnection(ConnectionConfiguration config) throws SQLException {
+    return manager.getDataSource(config).getConnection();
   }
 
-  public <K, V> PdxInstance read(Region<K, V> region, K key) {
+  public <K, V> PdxInstance read(Region<K, V> region, K key) throws SQLException {
     if (key == null) {
       throw new IllegalArgumentException("Key for query cannot be null");
     }
@@ -69,18 +65,16 @@ public class SqlHandler {
     ConnectionConfiguration connectionConfig =
         getConnectionConfig(regionMapping.getConnectionConfigName());
     String tableName = regionMapping.getRegionToTableName();
-    PdxInstance result = null;
+    PdxInstance result;
     try (Connection connection = getConnection(connectionConfig)) {
       List<ColumnValue> columnList =
           getColumnToValueList(connection, regionMapping, key, null, Operation.GET);
       try (PreparedStatement statement =
-          getPreparedStatement(connection, columnList, tableName, Operation.GET, 0)) {
+          getPreparedStatement(connection, columnList, tableName, Operation.GET)) {
         PdxInstanceFactory factory = getPdxInstanceFactory(region, regionMapping);
         String keyColumnName = getKeyColumnName(connection, tableName);
         result = executeReadStatement(statement, columnList, factory, regionMapping, keyColumnName);
       }
-    } catch (SQLException e) {
-      handleSQLException(e);
     }
     return result;
   }
@@ -122,32 +116,28 @@ public class SqlHandler {
   }
 
   PdxInstance executeReadStatement(PreparedStatement statement, List<ColumnValue> columnList,
-      PdxInstanceFactory factory, RegionMapping regionMapping, String keyColumnName) {
+      PdxInstanceFactory factory, RegionMapping regionMapping, String keyColumnName)
+      throws SQLException {
     PdxInstance pdxInstance = null;
-    try {
-      setValuesInStatement(statement, columnList);
-      try (ResultSet resultSet = statement.executeQuery()) {
-        if (resultSet.next()) {
-          ResultSetMetaData metaData = resultSet.getMetaData();
-          int ColumnsNumber = metaData.getColumnCount();
-          for (int i = 1; i <= ColumnsNumber; i++) {
-            Object columnValue = resultSet.getObject(i);
-            String columnName = metaData.getColumnName(i);
-            String fieldName = mapColumnNameToFieldName(columnName, regionMapping);
-            if (regionMapping.isPrimaryKeyInValue()
-                || !keyColumnName.equalsIgnoreCase(columnName)) {
-              factory.writeField(fieldName, columnValue, Object.class);
-            }
-          }
-          if (resultSet.next()) {
-            throw new IllegalStateException(
-                "Multiple rows returned for query: " + resultSet.getStatement().toString());
+    setValuesInStatement(statement, columnList);
+    try (ResultSet resultSet = statement.executeQuery()) {
+      if (resultSet.next()) {
+        ResultSetMetaData metaData = resultSet.getMetaData();
+        int ColumnsNumber = metaData.getColumnCount();
+        for (int i = 1; i <= ColumnsNumber; i++) {
+          Object columnValue = resultSet.getObject(i);
+          String columnName = metaData.getColumnName(i);
+          String fieldName = mapColumnNameToFieldName(columnName, regionMapping);
+          if (regionMapping.isPrimaryKeyInValue() || !keyColumnName.equalsIgnoreCase(columnName)) {
+            factory.writeField(fieldName, columnValue, Object.class);
           }
-          pdxInstance = factory.create();
         }
+        if (resultSet.next()) {
+          throw new JdbcConnectorException(
+              "Multiple rows returned for query: " + resultSet.getStatement().toString());
+        }
+        pdxInstance = factory.create();
       }
-    } catch (SQLException e) {
-      handleSQLException(e);
     }
     return pdxInstance;
   }
@@ -165,7 +155,8 @@ public class SqlHandler {
     return regionMapping.getFieldNameForColumn(columnName);
   }
 
-  public <K, V> void write(Region<K, V> region, Operation operation, K key, PdxInstance value) {
+  public <K, V> void write(Region<K, V> region, Operation operation, K key, PdxInstance value)
+      throws SQLException {
     if (value == null && operation != Operation.DESTROY) {
       throw new IllegalArgumentException("PdxInstance cannot be null for non-destroy operations");
     }
@@ -174,15 +165,18 @@ public class SqlHandler {
         getConnectionConfig(regionMapping.getConnectionConfigName());
 
     String tableName = regionMapping.getRegionToTableName();
-    int pdxTypeId = value == null ? 0 : ((PdxInstanceImpl) value).getPdxType().getTypeId();
 
     try (Connection connection = getConnection(connectionConfig)) {
       List<ColumnValue> columnList =
           getColumnToValueList(connection, regionMapping, key, value, operation);
       int updateCount = 0;
       try (PreparedStatement statement =
-          getPreparedStatement(connection, columnList, tableName, operation, pdxTypeId)) {
-        updateCount = executeWriteStatement(statement, columnList, operation, false);
+          getPreparedStatement(connection, columnList, tableName, operation)) {
+        updateCount = executeWriteStatement(statement, columnList);
+      } catch (SQLException e) {
+        if (operation.isDestroy()) {
+          throw e;
+        }
       }
 
       // Destroy action not guaranteed to modify any database rows
@@ -193,16 +187,14 @@ public class SqlHandler {
       if (updateCount <= 0) {
         Operation upsertOp = getOppositeOperation(operation);
         try (PreparedStatement upsertStatement =
-            getPreparedStatement(connection, columnList, tableName, upsertOp, pdxTypeId)) {
-          updateCount = executeWriteStatement(upsertStatement, columnList, upsertOp, true);
+            getPreparedStatement(connection, columnList, tableName, upsertOp)) {
+          updateCount = executeWriteStatement(upsertStatement, columnList);
         }
       }
 
       if (updateCount != 1) {
         throw new IllegalStateException("Unexpected updateCount " + updateCount);
       }
-    } catch (SQLException e) {
-      handleSQLException(e);
     }
   }
 
@@ -210,30 +202,16 @@ public class SqlHandler {
     return operation.isUpdate() ? Operation.CREATE : Operation.UPDATE;
   }
 
-  private int executeWriteStatement(PreparedStatement statement, List<ColumnValue> columnList,
-      Operation operation, boolean handleException) {
-    int updateCount = 0;
-    try {
-      setValuesInStatement(statement, columnList);
-      updateCount = statement.executeUpdate();
-    } catch (SQLException e) {
-      if (handleException || operation.isDestroy()) {
-        handleSQLException(e);
-      }
-    }
-    return updateCount;
+  private int executeWriteStatement(PreparedStatement statement, List<ColumnValue> columnList)
+      throws SQLException {
+    setValuesInStatement(statement, columnList);
+    return statement.executeUpdate();
   }
 
   private PreparedStatement getPreparedStatement(Connection connection,
-      List<ColumnValue> columnList, String tableName, Operation operation, int pdxTypeId) {
+      List<ColumnValue> columnList, String tableName, Operation operation) throws SQLException {
     String sqlStr = getSqlString(tableName, columnList, operation);
-    PreparedStatement statement = null;
-    try {
-      statement = connection.prepareStatement(sqlStr);
-    } catch (SQLException e) {
-      handleSQLException(e);
-    }
-    return statement;
+    return connection.prepareStatement(sqlStr);
   }
 
   private String getSqlString(String tableName, List<ColumnValue> columnList, Operation operation) {
@@ -279,8 +257,4 @@ public class SqlHandler {
     }
     return result;
   }
-
-  static void handleSQLException(SQLException e) {
-    throw new IllegalStateException("JDBC connector detected unexpected SQLException", e);
-  }
 }
diff --git a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManager.java b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManager.java
index 0d6e2da..03c9e69 100644
--- a/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManager.java
+++ b/geode-connectors/src/main/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManager.java
@@ -21,6 +21,8 @@ import java.sql.SQLException;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 
+import org.apache.geode.connectors.jdbc.JdbcConnectorException;
+
 /**
  * Given a tableName this manager will determine which column should correspond to the Geode Region
  * key. The current implementation uses a connection to lookup the SQL metadata for the table and
@@ -37,7 +39,7 @@ class TableKeyColumnManager {
   }
 
   private String computeKeyColumnName(Connection connection, String tableName) {
-    String key = null;
+    String key;
     try {
       DatabaseMetaData metaData = connection.getMetaData();
       try (ResultSet tables = metaData.getTables(null, null, "%", null)) {
@@ -45,7 +47,7 @@ class TableKeyColumnManager {
         key = getPrimaryKeyColumnNameFromMetaData(realTableName, metaData);
       }
     } catch (SQLException e) {
-      SqlHandler.handleSQLException(e);
+      throw new JdbcConnectorException(e);
     }
     return key;
   }
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java
index 8bb078f..578b5c4 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcAsyncWriterTest.java
@@ -67,7 +67,7 @@ public class JdbcAsyncWriterTest {
   }
 
   @Test
-  public void writesAProvidedEvent() {
+  public void writesAProvidedEvent() throws Exception {
     writer.processEvents(Collections.singletonList(createMockEvent()));
 
     verify(sqlHandler, times(1)).write(any(), any(), any(), any());
@@ -76,7 +76,7 @@ public class JdbcAsyncWriterTest {
   }
 
   @Test
-  public void writesMultipleProvidedEvents() {
+  public void writesMultipleProvidedEvents() throws Exception {
     List<AsyncEvent> events = new ArrayList<>();
     events.add(createMockEvent());
     events.add(createMockEvent());
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcLoaderTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcLoaderTest.java
index 620c9f8..8d4d062 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcLoaderTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcLoaderTest.java
@@ -48,7 +48,7 @@ public class JdbcLoaderTest {
   }
 
   @Test
-  public void loadReadsFromSqlHandler() {
+  public void loadReadsFromSqlHandler() throws Exception {
     loader.load(loaderHelper);
 
     verify(sqlHandler, times(1)).read(any(), any());
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java
index 92cbf2b..f8a4dc8 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/JdbcWriterTest.java
@@ -62,7 +62,7 @@ public class JdbcWriterTest {
   }
 
   @Test
-  public void beforeUpdateWithPdxInstanceWritesToSqlHandler() {
+  public void beforeUpdateWithPdxInstanceWritesToSqlHandler() throws Exception {
     writer.beforeUpdate(entryEvent);
 
     verify(sqlHandler, times(1)).write(any(), any(), any(), eq(pdxInstance));
@@ -77,14 +77,14 @@ public class JdbcWriterTest {
   }
 
   @Test
-  public void beforeCreateWithPdxInstanceWritesToSqlHandler() {
+  public void beforeCreateWithPdxInstanceWritesToSqlHandler() throws Exception {
     writer.beforeCreate(entryEvent);
 
     verify(sqlHandler, times(1)).write(any(), any(), any(), eq(pdxInstance));
   }
 
   @Test
-  public void beforeDestroyWithPdxInstanceWritesToSqlHandler() {
+  public void beforeDestroyWithPdxInstanceWritesToSqlHandler() throws Exception {
     writer.beforeDestroy(entryEvent);
 
     verify(sqlHandler, times(1)).write(any(), any(), any(), eq(pdxInstance));
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
index afe8988..2b3db92 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/SqlHandlerTest.java
@@ -45,6 +45,7 @@ import org.junit.rules.ExpectedException;
 
 import org.apache.geode.cache.Operation;
 import org.apache.geode.cache.Region;
+import org.apache.geode.connectors.jdbc.JdbcConnectorException;
 import org.apache.geode.internal.cache.InternalCache;
 import org.apache.geode.pdx.PdxInstanceFactory;
 import org.apache.geode.pdx.internal.PdxInstanceImpl;
@@ -113,7 +114,7 @@ public class SqlHandlerTest {
   }
 
   @Test
-  public void readReturnsNullIfNoKeyProvided() {
+  public void readReturnsNullIfNoKeyProvided() throws Exception {
     thrown.expect(IllegalArgumentException.class);
     handler.read(region, null);
   }
@@ -158,7 +159,7 @@ public class SqlHandlerTest {
   public void throwsExceptionIfQueryFails() throws Exception {
     when(statement.executeQuery()).thenThrow(SQLException.class);
 
-    thrown.expect(IllegalStateException.class);
+    thrown.expect(SQLException.class);
     handler.read(region, new Object());
   }
 
@@ -209,16 +210,15 @@ public class SqlHandlerTest {
     when(result.getStatement()).thenReturn(mock(PreparedStatement.class));
     when(statement.executeQuery()).thenReturn(result);
 
-    // when(manager.getKeyColumnName(any(), anyString())).thenReturn("key");
     when(cache.createPdxInstanceFactory(anyString(), anyBoolean()))
         .thenReturn(mock(PdxInstanceFactory.class));
 
-    thrown.expect(IllegalStateException.class);
+    thrown.expect(JdbcConnectorException.class);
     handler.read(region, new Object());
   }
 
   @Test
-  public void writeThrowsExceptionIfValueIsNullAndNotDoingDestroy() {
+  public void writeThrowsExceptionIfValueIsNullAndNotDoingDestroy() throws Exception {
     thrown.expect(IllegalArgumentException.class);
     handler.write(region, Operation.UPDATE, new Object(), null);
   }
@@ -267,7 +267,7 @@ public class SqlHandlerTest {
   public void destroyThrowExceptionWhenFail() throws Exception {
     when(statement.executeUpdate()).thenThrow(SQLException.class);
 
-    thrown.expect(IllegalStateException.class);
+    thrown.expect(SQLException.class);
     handler.write(region, Operation.DESTROY, new Object(), value);
   }
 
@@ -351,7 +351,7 @@ public class SqlHandlerTest {
     when(insertStatement.executeUpdate()).thenThrow(SQLException.class);
     when(connection.prepareStatement(any())).thenReturn(statement).thenReturn(insertStatement);
 
-    thrown.expect(IllegalStateException.class);
+    thrown.expect(SQLException.class);
     handler.write(region, Operation.UPDATE, new Object(), value);
     verify(statement).close();
     verify(insertStatement).close();
@@ -466,7 +466,7 @@ public class SqlHandlerTest {
     doThrow(new SQLException("test exception")).when(dataSource).getConnection();
 
     assertThatThrownBy(() -> handler.getConnection(connectionConfig))
-        .isInstanceOf(IllegalStateException.class).hasMessage("Could not connect to fake:url");
+        .isInstanceOf(SQLException.class).hasMessage("test exception");
   }
 
 
diff --git a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManagerTest.java b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManagerTest.java
index a087f15..3934b3a 100644
--- a/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManagerTest.java
+++ b/geode-connectors/src/test/java/org/apache/geode/connectors/jdbc/internal/TableKeyColumnManagerTest.java
@@ -31,6 +31,7 @@ import org.junit.Before;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
 
+import org.apache.geode.connectors.jdbc.JdbcConnectorException;
 import org.apache.geode.test.junit.categories.UnitTest;
 
 @Category(UnitTest.class)
@@ -74,7 +75,7 @@ public class TableKeyColumnManagerTest {
     when(connection.getMetaData()).thenThrow(SQLException.class);
 
     assertThatThrownBy(() -> tableKeyColumnManager.getKeyColumnName(connection, TABLE_NAME))
-        .isInstanceOf(IllegalStateException.class);
+        .isInstanceOf(JdbcConnectorException.class);
   }
 
   @Test

-- 
To stop receiving notification emails like this one, please contact
nreich@apache.org.