From d6d83100b7c06395bd96ad3301b66ce966613438 Mon Sep 17 00:00:00 2001 From: Afsaneh Rafighi Date: Wed, 31 Jan 2018 13:14:08 -0800 Subject: [PATCH 01/11] update for jdk9 --- appveyor.yml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index 8caae887f..5fff6778c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,7 +4,7 @@ init: - cmd: net start MSSQL$%SQL_Instance% environment: - JAVA_HOME: C:\Program Files\Java\jdk1.8.0 + JAVA_HOME: C:\Program Files\Java\jdk9 mssql_jdbc_test_connection_properties: jdbc:sqlserver://localhost:1433;instanceName=%SQL_Instance%;databaseName=master;username=sa;password=Password12!; matrix: @@ -32,9 +32,9 @@ build_script: - keytool -importkeystore -srckeystore cert.pfx -srcstoretype pkcs12 -destkeystore clientcert.jks -deststoretype JKS -srcstorepass password -deststorepass password - keytool -list -v -keystore clientcert.jks -storepass "password" > JavaKeyStore.txt - cd.. - # - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -Pbuild41 - # - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -Pbuild42 + - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -Pbuild43 + - mvn install -DskipTests=true -Dmaven.javadoc.skip=true -B -V -Pbuild42 -#test_script: -# - mvn test -B -Pbuild41 -# - mvn test -B -Pbuild42 +test_script: + - mvn test -B -Pbuild43 + - mvn test -B -Pbuild42 From e221b321984b517c876a2aecbcc29a678c2accbe Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Wed, 14 Feb 2018 13:19:02 -0800 Subject: [PATCH 02/11] Revert back needsPrepare check in retryBasedOnFailedReuseOfCachedHandle --- .../sqlserver/jdbc/SQLServerPreparedStatement.java | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index d4fe81010..b133cc67a 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -572,12 +572,7 @@ private boolean retryBasedOnFailedReuseOfCachedHandle(SQLException e, // ANSI_NULLS and QUOTED_IDENTIFIER set options are not changed since the handle is prepared. // 8179: Could not find prepared statement with handle %d. // 99586: Error used for testing. - if (needsPrepare) { - return false; - } - else { - return 1 == attempt && (586 == e.getErrorCode() || 8179 == e.getErrorCode() || 99586 == e.getErrorCode()) && connection.isStatementPoolingEnabled(); - } + return 1 == attempt && (586 == e.getErrorCode() || 8179 == e.getErrorCode() || 99586 == e.getErrorCode()) && connection.isStatementPoolingEnabled(); } /** From 9ae0843e6eca96ed2fa5064a28764cdcba83e13c Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Wed, 14 Feb 2018 13:29:33 -0800 Subject: [PATCH 03/11] Remove unwanted method parameter --- .../sqlserver/jdbc/SQLServerPreparedStatement.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index b133cc67a..0ec3d4aab 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -548,7 +548,7 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE getNextResult(); } catch (SQLException e) { - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare)) + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt)) continue; else throw e; @@ -566,7 +566,7 @@ else if (EXECUTE_UPDATE == executeMethod && null != resultSet) { /** Should the execution be retried because the re-used cached handle could not be re-used due to server side state changes? */ private boolean retryBasedOnFailedReuseOfCachedHandle(SQLException e, - int attempt, boolean needsPrepare) { + int attempt) { // Only retry based on these error codes and if statementPooling is enabled: // 586: The prepared statement handle %d is not valid in this context. Please verify that current database, user default schema, and // ANSI_NULLS and QUOTED_IDENTIFIER set options are not changed since the handle is prepared. @@ -2692,7 +2692,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th throw e; // Retry if invalid handle exception. - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare)) { + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt)) { // reset number of batches prepare numBatchesPrepared = numBatchesExecuted; retry = true; @@ -2723,7 +2723,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th } } catch (SQLException e) { - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare) && connection.isStatementPoolingEnabled()) { + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt) && connection.isStatementPoolingEnabled()) { // Reset number of batches prepared. numBatchesPrepared = numBatchesExecuted; continue; From 74dd4c276e6793795b87e53670a499c706e63780 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 11:39:46 -0800 Subject: [PATCH 04/11] Update changelog and driver version for RTW release --- CHANGELOG.md | 16 ++++++++++++++++ README.md | 12 ++++++------ pom.xml | 2 +- .../microsoft/sqlserver/jdbc/SQLJdbcVersion.java | 4 ++-- 4 files changed, 25 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8875a0e1c..c4e35d6a3 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,22 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) +## [6.4.0] Stable+ Release +### Added +- Support added for AAD Integrated Authentication with ADAL4J on Windows/Linux/Mac OS [#603](https://github.com/Microsoft/mssql-jdbc/pull/603) +- Enable Recover after MSDTC is restarted [#581](https://github.com/Microsoft/mssql-jdbc/pull/581) +- Added Version Update configuration rules to project [#541](https://github.com/Microsoft/mssql-jdbc/pull/541) + +### Fixed Issues +- Re-introduced Retry Logic for Prepared Statement Caching implementation and remove detect change context function [#618](https://github.com/Microsoft/mssql-jdbc/pull/618) and [#620](https://github.com/Microsoft/mssql-jdbc/pull/620) +- Fixes for SonarQube Reported issues [#599](https://github.com/Microsoft/mssql-jdbc/pull/599) +- Fixes for Random Assertion Errors [#597](https://github.com/Microsoft/mssql-jdbc/pull/597) + +### Changed +- JDK 9 Compatibility + JDBC 4.3 API support added, removed JDK 7 support from the driver [#601](https://github.com/Microsoft/mssql-jdbc/pull/601) +- Updated Appveyor to use JDK9 building driver and running tests [#619](https://github.com/Microsoft/mssql-jdbc/pull/619) + + ## [6.3.6] Preview Release ### Added - Added support for using database name as part of the key for handle cache [#561](https://github.com/Microsoft/mssql-jdbc/pull/561) diff --git a/README.md b/README.md index 6d2d0a746..90e67e3da 100644 --- a/README.md +++ b/README.md @@ -80,7 +80,7 @@ We're now on the Maven Central Repository. Add the following to your POM file to com.microsoft.sqlserver mssql-jdbc - 6.2.2.jre8 + 6.4.0.jre9 ``` The driver can be downloaded from the [Microsoft Download Center](https://go.microsoft.com/fwlink/?linkid=852460). @@ -120,14 +120,14 @@ Projects that require either of the two features need to explicitly declare the com.microsoft.sqlserver mssql-jdbc - 6.3.6.jre8-preview + 6.4.0.jre8 compile com.microsoft.azure adal4j - 1.3.0 + 1.4.0 ``` @@ -136,14 +136,14 @@ Projects that require either of the two features need to explicitly declare the com.microsoft.sqlserver mssql-jdbc - 6.3.6.jre8-preview + 6.4.0.jre8 compile com.microsoft.azure adal4j - 1.3.0 + 1.4.0 @@ -160,7 +160,7 @@ We love contributions from the community. To help improve the quality of our co Thank you! ## Guidelines for Reporting Issues -We appreciate you taking the time to test the driver, provide feedback and report any issues. It would be extremely helpful if you: +We appreciate you taking the time to test the driver, provide feedback and report any issues. It would be extremely helpful if you: - Report each issue as a new issue (but check first if it's already been reported) - Try to be detailed in your report. Useful information for good bug reports include: diff --git a/pom.xml b/pom.xml index c6e459c4e..6c41936d5 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ com.microsoft.sqlserver mssql-jdbc - 6.4.0-SNAPSHOT.${jreVersion} + 6.4.0.${jreVersion} jar Microsoft JDBC Driver for SQL Server diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLJdbcVersion.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLJdbcVersion.java index 81ab1a603..9aaaa8f52 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLJdbcVersion.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLJdbcVersion.java @@ -10,7 +10,7 @@ final class SQLJdbcVersion { static final int major = 6; - static final int minor = 3; - static final int patch = 6; + static final int minor = 4; + static final int patch = 0; static final int build = 0; } From 89c552bb669ef020ad1e4b85d0d0d4eb3fe0fafc Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 11:40:47 -0800 Subject: [PATCH 05/11] Minor Fix --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index c4e35d6a3..b38adc42c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,7 +3,7 @@ All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](http://keepachangelog.com/) -## [6.4.0] Stable+ Release +## [6.4.0] Stable Release ### Added - Support added for AAD Integrated Authentication with ADAL4J on Windows/Linux/Mac OS [#603](https://github.com/Microsoft/mssql-jdbc/pull/603) - Enable Recover after MSDTC is restarted [#581](https://github.com/Microsoft/mssql-jdbc/pull/581) From 77ff9deee4b8f6717ccec31ed065fe9561dc31e0 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 12:00:25 -0800 Subject: [PATCH 06/11] Minor change to update to jre9 --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 90e67e3da..4983f0c10 100644 --- a/README.md +++ b/README.md @@ -120,7 +120,7 @@ Projects that require either of the two features need to explicitly declare the com.microsoft.sqlserver mssql-jdbc - 6.4.0.jre8 + 6.4.0.jre9 compile @@ -136,7 +136,7 @@ Projects that require either of the two features need to explicitly declare the com.microsoft.sqlserver mssql-jdbc - 6.4.0.jre8 + 6.4.0.jre9 compile From ff1f049fa39d11a194edc29d09df7bb6efda17bd Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 12:42:30 -0800 Subject: [PATCH 07/11] Added needsPrepare Check and removed error code 99586 check --- .../sqlserver/jdbc/SQLServerPreparedStatement.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index 0ec3d4aab..5da1b8db1 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -548,7 +548,7 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE getNextResult(); } catch (SQLException e) { - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt)) + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare)) continue; else throw e; @@ -566,13 +566,13 @@ else if (EXECUTE_UPDATE == executeMethod && null != resultSet) { /** Should the execution be retried because the re-used cached handle could not be re-used due to server side state changes? */ private boolean retryBasedOnFailedReuseOfCachedHandle(SQLException e, - int attempt) { + int attempt, boolean needsPrepare) { // Only retry based on these error codes and if statementPooling is enabled: // 586: The prepared statement handle %d is not valid in this context. Please verify that current database, user default schema, and // ANSI_NULLS and QUOTED_IDENTIFIER set options are not changed since the handle is prepared. // 8179: Could not find prepared statement with handle %d. - // 99586: Error used for testing. - return 1 == attempt && (586 == e.getErrorCode() || 8179 == e.getErrorCode() || 99586 == e.getErrorCode()) && connection.isStatementPoolingEnabled(); + if(needsPrepare) {return false;} + return 1 == attempt && (586 == e.getErrorCode() || 8179 == e.getErrorCode()) && connection.isStatementPoolingEnabled(); } /** @@ -2692,7 +2692,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th throw e; // Retry if invalid handle exception. - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt)) { + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare)) { // reset number of batches prepare numBatchesPrepared = numBatchesExecuted; retry = true; @@ -2723,7 +2723,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th } } catch (SQLException e) { - if (retryBasedOnFailedReuseOfCachedHandle(e, attempt) && connection.isStatementPoolingEnabled()) { + if (retryBasedOnFailedReuseOfCachedHandle(e, attempt, needsPrepare) && connection.isStatementPoolingEnabled()) { // Reset number of batches prepared. numBatchesPrepared = numBatchesExecuted; continue; From ba2460c18df023714d31d35c0313f31358f188f4 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 13:29:10 -0800 Subject: [PATCH 08/11] Added check for needsPrepare and removed 99586 check + Moved NeedsPrepare to class level declaration to avoid multi-threading issues. --- .../sqlserver/jdbc/SQLServerPreparedStatement.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index 5da1b8db1..cbb4687f9 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -69,6 +69,7 @@ public class SQLServerPreparedStatement extends SQLServerStatement implements IS /** True if this execute has been called for this statement at least once */ private boolean isExecutedAtLeastOnce = false; + private boolean needsPrepare = false; /** Reference to cache item for statement handle pooling. Only used to decrement ref count on statement close. */ private PreparedStatementHandle cachedPreparedStatementHandle; @@ -528,7 +529,6 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE } String dbName = connection.getSCatalog(); - boolean needsPrepare = false; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { @@ -571,7 +571,7 @@ private boolean retryBasedOnFailedReuseOfCachedHandle(SQLException e, // 586: The prepared statement handle %d is not valid in this context. Please verify that current database, user default schema, and // ANSI_NULLS and QUOTED_IDENTIFIER set options are not changed since the handle is prepared. // 8179: Could not find prepared statement with handle %d. - if(needsPrepare) {return false;} + if(needsPrepare) return false; return 1 == attempt && (586 == e.getErrorCode() || 8179 == e.getErrorCode()) && connection.isStatementPoolingEnabled(); } @@ -981,7 +981,7 @@ private boolean doPrepExec(TDSWriter tdsWriter, boolean hasNewTypeDefinitions, boolean hasExistingTypeDefinitions) throws SQLServerException { - boolean needsPrepare = (hasNewTypeDefinitions && hasExistingTypeDefinitions) || !hasPreparedStatementHandle(); + needsPrepare = (hasNewTypeDefinitions && hasExistingTypeDefinitions) || !hasPreparedStatementHandle(); // Cursors don't use statement pooling. if (isCursorable(executeMethod)) { @@ -2629,7 +2629,6 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th } String dbName = connection.getSCatalog(); - boolean needsPrepare = false; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { From 0eb0a6140d66cb0a63e86a4317e8f31b6c2b22a1 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 14:32:18 -0800 Subject: [PATCH 09/11] Moved 'needsPrepare' to local variable. --- .../microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index cbb4687f9..67bc5dd68 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -69,7 +69,6 @@ public class SQLServerPreparedStatement extends SQLServerStatement implements IS /** True if this execute has been called for this statement at least once */ private boolean isExecutedAtLeastOnce = false; - private boolean needsPrepare = false; /** Reference to cache item for statement handle pooling. Only used to decrement ref count on statement close. */ private PreparedStatementHandle cachedPreparedStatementHandle; @@ -529,6 +528,7 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE } String dbName = connection.getSCatalog(); + boolean needsPrepare = false; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { @@ -981,7 +981,7 @@ private boolean doPrepExec(TDSWriter tdsWriter, boolean hasNewTypeDefinitions, boolean hasExistingTypeDefinitions) throws SQLServerException { - needsPrepare = (hasNewTypeDefinitions && hasExistingTypeDefinitions) || !hasPreparedStatementHandle(); + boolean needsPrepare = (hasNewTypeDefinitions && hasExistingTypeDefinitions) || !hasPreparedStatementHandle(); // Cursors don't use statement pooling. if (isCursorable(executeMethod)) { @@ -2629,6 +2629,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th } String dbName = connection.getSCatalog(); + boolean needsPrepare = false; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { From ea723f6492e6bc81e3a9187ce4455f0ea52dbd95 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Thu, 15 Feb 2018 16:28:36 -0800 Subject: [PATCH 10/11] Defaulting needsPrepare to true. --- .../microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java index 67bc5dd68..262728a94 100644 --- a/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java +++ b/src/main/java/com/microsoft/sqlserver/jdbc/SQLServerPreparedStatement.java @@ -528,7 +528,7 @@ final void doExecutePreparedStatement(PrepStmtExecCmd command) throws SQLServerE } String dbName = connection.getSCatalog(); - boolean needsPrepare = false; + boolean needsPrepare = true; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { @@ -2629,7 +2629,7 @@ final void doExecutePreparedStatementBatch(PrepStmtBatchExecCmd batchCommand) th } String dbName = connection.getSCatalog(); - boolean needsPrepare = false; + boolean needsPrepare = true; // Retry execution if existing handle could not be re-used. for (int attempt = 1; attempt <= 2; ++attempt) { try { From d6a4d355670dfda68677e44793ecebfe922a92f5 Mon Sep 17 00:00:00 2001 From: Cheena Malhotra Date: Fri, 16 Feb 2018 13:49:17 -0800 Subject: [PATCH 11/11] Moving JDK9 support to added section --- CHANGELOG.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index b38adc42c..75e387bde 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) - Support added for AAD Integrated Authentication with ADAL4J on Windows/Linux/Mac OS [#603](https://github.com/Microsoft/mssql-jdbc/pull/603) - Enable Recover after MSDTC is restarted [#581](https://github.com/Microsoft/mssql-jdbc/pull/581) - Added Version Update configuration rules to project [#541](https://github.com/Microsoft/mssql-jdbc/pull/541) +- JDK 9 Compatibility + JDBC 4.3 API support added to the driver [#601 (https://github.com/Microsoft/mssql-jdbc/pull/601) ### Fixed Issues - Re-introduced Retry Logic for Prepared Statement Caching implementation and remove detect change context function [#618](https://github.com/Microsoft/mssql-jdbc/pull/618) and [#620](https://github.com/Microsoft/mssql-jdbc/pull/620) @@ -15,9 +16,8 @@ The format is based on [Keep a Changelog](http://keepachangelog.com/) - Fixes for Random Assertion Errors [#597](https://github.com/Microsoft/mssql-jdbc/pull/597) ### Changed -- JDK 9 Compatibility + JDBC 4.3 API support added, removed JDK 7 support from the driver [#601](https://github.com/Microsoft/mssql-jdbc/pull/601) - Updated Appveyor to use JDK9 building driver and running tests [#619](https://github.com/Microsoft/mssql-jdbc/pull/619) - +- JDK 7 compilation support removed from the driver [#601](https://github.com/Microsoft/mssql-jdbc/pull/601) ## [6.3.6] Preview Release ### Added