Skip to content

Commit 53ddba0

Browse files
authored
Use concurrent lists for cleanup collections. (#501)
Allow cleanup collections to be accessed by the housekeeper while closing is in progress.
1 parent 92b7fd4 commit 53ddba0

File tree

2 files changed

+14
-12
lines changed

2 files changed

+14
-12
lines changed

driver/src/main/java/com/impossibl/postgres/jdbc/PGDirectConnection.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -124,15 +124,16 @@
124124
import java.sql.Savepoint;
125125
import java.sql.Struct;
126126
import java.text.ParseException;
127-
import java.util.ArrayList;
128127
import java.util.Arrays;
128+
import java.util.Collection;
129129
import java.util.HashMap;
130130
import java.util.Iterator;
131131
import java.util.List;
132132
import java.util.Map;
133133
import java.util.Objects;
134134
import java.util.Properties;
135135
import java.util.concurrent.ConcurrentHashMap;
136+
import java.util.concurrent.ConcurrentLinkedQueue;
136137
import java.util.concurrent.CountDownLatch;
137138
import java.util.concurrent.Executor;
138139
import java.util.concurrent.ScheduledFuture;
@@ -178,11 +179,11 @@ public class PGDirectConnection extends BasicContext implements PGConnection {
178179
private static class Cleanup implements CleanupRunnable {
179180

180181
ServerConnection serverConnection;
181-
List<WeakReference<PGStatement>> statements;
182+
Collection<WeakReference<PGStatement>> statements;
182183
StackTraceElement[] allocationStackTrace;
183184
String connectionInfo;
184185

185-
private Cleanup(ServerConnection serverConnection, List<WeakReference<PGStatement>> statements, String connectionInfo) {
186+
private Cleanup(ServerConnection serverConnection, Collection<WeakReference<PGStatement>> statements, String connectionInfo) {
186187
this.serverConnection = serverConnection;
187188
this.statements = statements;
188189
this.allocationStackTrace = new Exception().getStackTrace();
@@ -217,7 +218,7 @@ public void run() {
217218
boolean autoCommit = true;
218219
private int networkTimeout;
219220
private SQLWarning warningChain;
220-
private List<WeakReference<PGStatement>> activeStatements;
221+
private Collection<WeakReference<PGStatement>> activeStatements;
221222
private Map<StatementCacheKey, StatementDescription> descriptionCache;
222223
private Map<StatementCacheKey, PreparedStatementDescription> preparedStatementCache;
223224
private int preparedStatementCacheThreshold;
@@ -234,7 +235,7 @@ public void run() {
234235

235236
this.strict = getSetting(STRICT_MODE);
236237
this.networkTimeout = getSetting(DEFAULT_NETWORK_TIMEOUT);
237-
this.activeStatements = new ArrayList<>();
238+
this.activeStatements = new ConcurrentLinkedQueue<>();
238239
this.notificationListeners = new ConcurrentHashMap<>();
239240

240241
final int descriptionCacheSize = getSetting(DESCRIPTION_CACHE_SIZE);
@@ -394,7 +395,7 @@ else if (s == statement) {
394395
*
395396
* @param statements Statements to close
396397
*/
397-
private static void closeStatements(List<WeakReference<PGStatement>> statements) {
398+
private static void closeStatements(Collection<WeakReference<PGStatement>> statements) {
398399

399400
for (WeakReference<PGStatement> statementRef : statements) {
400401

driver/src/main/java/com/impossibl/postgres/jdbc/PGStatement.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,11 @@
4848
import java.sql.SQLException;
4949
import java.sql.SQLWarning;
5050
import java.sql.Statement;
51-
import java.util.ArrayList;
51+
import java.util.Collection;
5252
import java.util.Iterator;
5353
import java.util.List;
5454
import java.util.Map;
55+
import java.util.concurrent.ConcurrentLinkedQueue;
5556

5657
import static java.lang.Long.min;
5758
import static java.util.concurrent.TimeUnit.SECONDS;
@@ -74,10 +75,10 @@ private static class Cleanup implements CleanupRunnable {
7475

7576
PGDirectConnection connection;
7677
String name;
77-
List<WeakReference<PGResultSet>> resultSets;
78+
Collection<WeakReference<PGResultSet>> resultSets;
7879
StackTraceElement[] allocationStackTrace;
7980

80-
private Cleanup(PGDirectConnection connection, String name, List<WeakReference<PGResultSet>> resultSets) {
81+
private Cleanup(PGDirectConnection connection, String name, Collection<WeakReference<PGResultSet>> resultSets) {
8182
this.connection = connection;
8283
this.name = name;
8384
this.resultSets = resultSets;
@@ -129,7 +130,7 @@ public void run() {
129130
Query query;
130131
List<ResultBatch> resultBatches;
131132
boolean autoClose;
132-
List<WeakReference<PGResultSet>> activeResultSets;
133+
Collection<WeakReference<PGResultSet>> activeResultSets;
133134
PGResultSet generatedKeysResultSet;
134135
SQLWarning warningChain;
135136
int queryTimeout;
@@ -148,7 +149,7 @@ public void run() {
148149
this.name = name;
149150
this.processEscapes = true;
150151
this.resultFields = resultFields;
151-
this.activeResultSets = new ArrayList<>();
152+
this.activeResultSets = new ConcurrentLinkedQueue<>();
152153
this.generatedKeysResultSet = null;
153154
this.fetchSize = connection.getDefaultFetchSize();
154155

@@ -199,7 +200,7 @@ static void closeCursor(PGDirectConnection connection, String cursorName) throws
199200
* Closes the given list of result-sets
200201
*
201202
*/
202-
private static void closeResultSets(List<WeakReference<PGResultSet>> resultSets) {
203+
private static void closeResultSets(Collection<WeakReference<PGResultSet>> resultSets) {
203204

204205
for (WeakReference<PGResultSet> resultSetRef : resultSets) {
205206

0 commit comments

Comments
 (0)