Skip to content
This repository was archived by the owner on Jun 3, 2024. It is now read-only.

Commit 99d50d9

Browse files
committed
defaultReadonly/autoCommit/etc now get reset back to defaults on connection close.
1 parent 8a1e5a2 commit 99d50d9

4 files changed

Lines changed: 56 additions & 69 deletions

File tree

bonecp/src/main/java/com/jolbox/bonecp/BoneCP.java

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -58,8 +58,6 @@
5858
*
5959
*/
6060
public class BoneCP implements Serializable {
61-
/** Warning message. */
62-
private static final String DISABLED_AUTO_COMMIT_WARNING = "Auto-commit was disabled but no commit/rollback was issued by the time this connection was closed. Performing rollback! Enable config setting detectUnresolvedTransactions for more debugging info.";
6361
/** Warning message. */
6462
private static final String THREAD_CLOSE_CONNECTION_WARNING = "Thread close connection monitoring has been enabled. This will negatively impact on your performance. Only enable this option for debugging purposes!";
6563
/** Serialization UID */
@@ -297,19 +295,6 @@ protected Connection obtainRawInternalConnection()
297295
result = DriverManager.getConnection(url, username, password);
298296
}
299297

300-
if (this.defaultAutoCommit != null){
301-
result.setAutoCommit(this.defaultAutoCommit);
302-
}
303-
if (this.defaultReadOnly != null){
304-
result.setReadOnly(this.defaultReadOnly);
305-
}
306-
if (this.defaultCatalog != null){
307-
result.setCatalog(this.defaultCatalog);
308-
}
309-
if (this.defaultTransactionIsolationValue != -1){
310-
result.setTransactionIsolation(this.defaultTransactionIsolationValue);
311-
}
312-
313298
return result;
314299
}
315300

@@ -649,32 +634,6 @@ protected void internalReleaseConnection(ConnectionHandle connectionHandle) thro
649634
*/
650635
protected void putConnectionBackInPartition(ConnectionHandle connectionHandle) throws SQLException {
651636

652-
if (this.resetConnectionOnClose && !connectionHandle.getInternalConnection().getAutoCommit() && !connectionHandle.isTxResolved()){
653-
if (connectionHandle.getAutoCommitStackTrace() != null){
654-
logger.warn(connectionHandle.getAutoCommitStackTrace());
655-
connectionHandle.setAutoCommitStackTrace(null);
656-
} else {
657-
logger.warn(DISABLED_AUTO_COMMIT_WARNING);
658-
}
659-
connectionHandle.getInternalConnection().rollback();
660-
connectionHandle.getInternalConnection().setAutoCommit(true);
661-
}
662-
663-
// restore sanity
664-
if (this.defaultAutoCommit != null){
665-
connectionHandle.getInternalConnection().setAutoCommit(this.defaultAutoCommit);
666-
}
667-
if (this.defaultReadOnly != null){
668-
connectionHandle.getInternalConnection().setReadOnly(this.defaultReadOnly);
669-
}
670-
if (this.defaultCatalog != null){
671-
connectionHandle.getInternalConnection().setCatalog(this.defaultCatalog);
672-
}
673-
if (this.defaultTransactionIsolationValue != -1){
674-
connectionHandle.getInternalConnection().setTransactionIsolation(this.defaultTransactionIsolationValue);
675-
}
676-
677-
678637
if (this.cachedPoolStrategy && connectionHandle.inUseInThreadLocalContext.get()){
679638
// this might fail if we have a thread that takes up more than one thread
680639
// (we only track one)

bonecp/src/main/java/com/jolbox/bonecp/ConnectionHandle.java

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,16 @@ public class ConnectionHandle implements Connection{
7676
private long connectionCreationTimeInMs = System.currentTimeMillis();
7777
/** Pool handle. */
7878
private BoneCP pool;
79+
/** Config setting. */
80+
private Boolean defaultReadOnly;
81+
/** Config setting. */
82+
private String defaultCatalog;
83+
/** Config setting. */
84+
private int defaultTransactionIsolationValue;
85+
/** Config setting. */
86+
private Boolean defaultAutoCommit;
87+
/** Config setting. */
88+
private boolean resetConnectionOnClose;
7989
/**
8090
* If true, this connection might have failed communicating with the
8191
* database. We assume that exceptions should be rare here i.e. the normal
@@ -202,6 +212,11 @@ private ConnectionHandle(String url, String username, String password,
202212
this.url = url;
203213
this.connection = obtainInternalConnection();
204214
this.finalizableRefs = this.pool.getFinalizableRefs();
215+
this.defaultReadOnly = pool.getConfig().getDefaultReadOnly();
216+
this.defaultCatalog = pool.getConfig().getDefaultCatalog();
217+
this.defaultTransactionIsolationValue = pool.getConfig().getDefaultTransactionIsolationValue();
218+
this.defaultAutoCommit = pool.getConfig().getDefaultAutoCommit();
219+
this.resetConnectionOnClose = pool.getConfig().isResetConnectionOnClose();
205220
this.connectionTrackingDisabled = pool.getConfig().isDisableConnectionTracking();
206221
this.statisticsEnabled = pool.getConfig().isStatisticsEnabled();
207222
this.statistics = pool.getStatistics();
@@ -221,6 +236,20 @@ private ConnectionHandle(String url, String username, String password,
221236
this.callableStatementCache = new StatementCache(cacheSize, pool.getConfig().isStatisticsEnabled(), pool.getStatistics());
222237
this.statementCachingEnabled = true;
223238
}
239+
240+
if (this.defaultAutoCommit != null){
241+
setAutoCommit(this.defaultAutoCommit);
242+
}
243+
if (this.defaultReadOnly != null){
244+
setReadOnly(this.defaultReadOnly);
245+
}
246+
if (this.defaultCatalog != null){
247+
setCatalog(this.defaultCatalog);
248+
}
249+
if (this.defaultTransactionIsolationValue != -1){
250+
setTransactionIsolation(this.defaultTransactionIsolationValue);
251+
}
252+
224253
}
225254

226255
/** Obtains a database connection, retrying if necessary.
@@ -416,6 +445,32 @@ private void checkClosed() throws SQLException {
416445
public void close() throws SQLException {
417446
try {
418447
if (!this.logicallyClosed) {
448+
449+
if (this.resetConnectionOnClose && !getAutoCommit() && !isTxResolved()){
450+
if (this.autoCommitStackTrace != null){
451+
logger.warn(this.autoCommitStackTrace);
452+
this.autoCommitStackTrace = null;
453+
} else {
454+
logger.warn(DISABLED_AUTO_COMMIT_WARNING);
455+
}
456+
rollback();
457+
setAutoCommit(true);
458+
}
459+
460+
// restore sanity
461+
if (this.defaultAutoCommit != null){
462+
setAutoCommit(this.defaultAutoCommit);
463+
}
464+
if (this.defaultReadOnly != null){
465+
setReadOnly(this.defaultReadOnly);
466+
}
467+
if (this.defaultCatalog != null){
468+
setCatalog(this.defaultCatalog);
469+
}
470+
if (this.defaultTransactionIsolationValue != -1){
471+
this.setTransactionIsolation(this.defaultTransactionIsolationValue);
472+
}
473+
419474
this.logicallyClosed = true;
420475
this.threadUsingConnection = null;
421476
if (this.threadWatch != null){

bonecp/src/test/java/com/jolbox/bonecp/TestBoneCP.java

Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -923,34 +923,6 @@ public void testPutConnectionBackInPartitionWithResetConnectionOnClose() throws
923923

924924
}
925925

926-
/**
927-
* Test method for {@link com.jolbox.bonecp.BoneCP#putConnectionBackInPartition(com.jolbox.bonecp.ConnectionHandle)}.
928-
* @throws InterruptedException
929-
* @throws SQLException
930-
*/
931-
@Test
932-
public void testPutConnectionBackInPartitionWithResetConnectionOnCloseWithStackTrace() throws InterruptedException, SQLException {
933-
expect(mockPartition.getFreeConnections()).andReturn(mockConnectionHandles).anyTimes();
934-
expect(mockPartition.getAvailableConnections()).andReturn(1).anyTimes();
935-
936-
expect(mockConnection.getOriginatingPartition()).andReturn(mockPartition).anyTimes();
937-
expect(mockConnectionHandles.tryTransfer(mockConnection)).andReturn(false).anyTimes();
938-
expect(mockConnectionHandles.offer(mockConnection)).andReturn(true).once();
939-
expect(mockConnection.isTxResolved()).andReturn(false).once();
940-
expect(mockConnection.getAutoCommitStackTrace()).andReturn("Foo").once();
941-
mockConnection.setAutoCommitStackTrace(null);
942-
Connection mockInternalConnection = createNiceMock(Connection.class);
943-
expect(mockInternalConnection.getAutoCommit()).andReturn(false).once();
944-
expect(mockConnection.getInternalConnection()).andReturn(mockInternalConnection).anyTimes();
945-
mockInternalConnection.rollback();
946-
mockInternalConnection.setAutoCommit(true);
947-
replay(mockInternalConnection, mockPartition, mockConnectionHandles, mockConnection);
948-
testClass.resetConnectionOnClose = true;
949-
testClass.putConnectionBackInPartition(mockConnection);
950-
verify(mockPartition, mockConnectionHandles, mockConnection);
951-
952-
}
953-
954926

955927
/**
956928
* Test method for com.jolbox.bonecp.BoneCP isConnectionHandleAlive.

bonecp/src/test/java/com/jolbox/bonecp/TestPoolWatchThread.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,7 @@ public static void setup() throws IllegalArgumentException, IllegalAccessExcepti
7474
// expect(mockConfig.getConnectionHook()).andReturn(null).anyTimes();
7575
expect(mockConfig.getAcquireRetryDelayInMs()).andReturn(1000L).anyTimes();
7676
expect(mockConfig.getAcquireRetryAttempts()).andReturn(0).anyTimes();
77+
expect(mockConfig.getDefaultTransactionIsolationValue()).andReturn(-1).anyTimes();
7778

7879
expect(mockConfig.getConnectionHook()).andReturn(new CoverageHook()).anyTimes();
7980
expect(mockConfig.isLazyInit()).andReturn(true).anyTimes();

0 commit comments

Comments
 (0)