changeset 623:1c3cdf0667d7

Do more cleanup in the close() methods such as calling clearWarnings(), clearParameters(), clearBatch() and dereferencing cached objects. Remove deprecated finalize() method from MonetPreparedStatement. finalize() is deprecated from Java 9 onwards.
author Martin van Dinther <martin.van.dinther@monetdbsolutions.com>
date Thu, 20 Jan 2022 13:00:00 +0100 (2022-01-20)
parents 61877c1f19f6
children 71bcc7af90be
files src/main/java/org/monetdb/jdbc/MonetConnection.java src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java src/main/java/org/monetdb/jdbc/MonetResultSet.java src/main/java/org/monetdb/jdbc/MonetStatement.java
diffstat 4 files changed, 37 insertions(+), 23 deletions(-) [+]
line wrap: on
line diff
--- a/src/main/java/org/monetdb/jdbc/MonetConnection.java
+++ b/src/main/java/org/monetdb/jdbc/MonetConnection.java
@@ -432,7 +432,14 @@ public class MonetConnection
 	 */
 	@Override
 	public void close() {
+		if (closed)
+			return;
+
+		clearWarnings();
+		dbmd = null;
 		synchronized (server) {
+			// Note: An entry in a WeakHashMap will automatically be
+			// removed when its key is no longer in ordinary use.
 			for (Statement st : statements.keySet()) {
 				try {
 					st.close();
@@ -2587,7 +2594,8 @@ public class MonetConnection
 		 */
 		@Override
 		public void close() {
-			if (closed) return;
+			if (closed)
+				return;
 
 			// send command to server indicating we're done with this
 			// result only if we had an ID in the header and this result
@@ -2605,7 +2613,12 @@ public class MonetConnection
 				if (r != null)
 					r.close();
 			}
-
+			name = null;
+			type = null;
+			columnLengths = null;
+			tableNames = null;
+			schemaNames = null;
+			resultBlocks = null;
 			closed = true;
 		}
 
--- a/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
+++ b/src/main/java/org/monetdb/jdbc/MonetPreparedStatement.java
@@ -2692,28 +2692,24 @@ public class MonetPreparedStatement
 	 */
 	@Override
 	public void close() {
-		try {
-			if (!closed && id != -1)
+		if (!closed && id != -1) {
+			try {
 				connection.sendControlCommand("release " + id);
-		} catch (SQLException e) {
-			// probably server closed connection
+			} catch (SQLException e) {
+				// probably server closed connection
+			}
 		}
+		clearParameters();
+		mTimestampZ = null;
+		mTimestamp = null;
+		mTimeZ = null;
+		mTime = null;
+		mDate = null;
+		execStmt = null;
 		super.close();
 	}
 
 	/**
-	 * Call close to release the server-sided handle for this
-	 * PreparedStatement.
-	 *
-	 * @deprecated (since="9")
-	 */
-	@Override
-	@Deprecated
-	protected void finalize() {
-		close();
-	}
-
-	/**
 	 * Return the prepared SQL statement including parameter types and parameter values that were set.
 	 *
 	 * @return a String representing this Object
--- a/src/main/java/org/monetdb/jdbc/MonetResultSet.java
+++ b/src/main/java/org/monetdb/jdbc/MonetResultSet.java
@@ -320,6 +320,7 @@ public class MonetResultSet
 	 */
 	@Override
 	public void close() {
+		clearWarnings();
 		if (header != null && !header.isClosed()) {
 			header.close();
 		}
--- a/src/main/java/org/monetdb/jdbc/MonetStatement.java
+++ b/src/main/java/org/monetdb/jdbc/MonetStatement.java
@@ -252,11 +252,15 @@ public class MonetStatement
 	 */
 	@Override
 	public void close() {
+		clearBatch();
+		clearWarnings();
 		// close previous ResultSet, if not closed already
 		if (lastResponseList != null) {
 			lastResponseList.close();
 			lastResponseList = null;
 		}
+		header = null;
+		batchLock = null;
 		closed = true;
 	}
 
@@ -904,8 +908,7 @@ public class MonetStatement
 	 * general should not be necessary given SQL standards compliance.
 	 * In this sense, this driver will ignore any call to this function.
 	 *
-	 * @param enable true to enable escape processing; false to disable
-	 *        it
+	 * @param enable true to enable escape processing; false to disable it
 	 * @throws SQLException if a database access error occurs
 	 */
 	@Override
@@ -952,7 +955,7 @@ public class MonetStatement
 	 */
 	@Override
 	public void setFetchSize(final int rows) throws SQLException {
-		if (rows >= 0 && !(getMaxRows() != 0 && rows > getMaxRows())) {
+		if (rows >= 0 && !(maxRows != 0 && rows > getMaxRows())) {
 			fetchSize = rows;
 		} else {
 			throw new SQLException("Illegal fetch size value: " + rows, "M1M05");
@@ -1509,7 +1512,7 @@ public class MonetStatement
  * TODO: try to eliminate the need for this class completely.
  */
 final class MonetVirtualResultSet extends MonetResultSet {
-	private final String results[][];
+	private String results[][];
 	private boolean closed;
 
 	MonetVirtualResultSet(
@@ -1571,7 +1574,8 @@ final class MonetVirtualResultSet extend
 	 */
 	@Override
 	public void close() {
+		results = null;
 		closed = true;
-		// types and columns are MonetResultSets private parts
+		super.close();
 	}
 }