From d8e624e97e4d8648dfd6c75981a6591a55a9a938 Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Fri, 2 Aug 2019 01:19:16 +0200 Subject: [PATCH] Consistent suppression of get/clearWarnings without target connection See gh-23346 --- .../LazyConnectionDataSourceProxy.java | 14 +++------- .../TransactionAwareDataSourceProxy.java | 8 +++--- .../DataSourceTransactionManagerTests.java | 27 +++++++++++++++---- 3 files changed, 30 insertions(+), 19 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java index 5adde7fd90..f198c662d7 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/LazyConnectionDataSourceProxy.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -354,18 +354,12 @@ public class LazyConnectionDataSourceProxy extends DelegatingDataSource { this.holdability = (Integer) args[0]; return null; } - else if (method.getName().equals("commit")) { + else if (method.getName().equals("commit") || method.getName().equals("rollback")) { // Ignore: no statements created yet. return null; } - else if (method.getName().equals("rollback")) { - // Ignore: no statements created yet. - return null; - } - else if (method.getName().equals("getWarnings")) { - return null; - } - else if (method.getName().equals("clearWarnings")) { + else if (method.getName().equals("getWarnings") || method.getName().equals("clearWarnings")) { + // Ignore: no warnings to expose yet. return null; } else if (method.getName().equals("close")) { diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java index 97a2fdc951..7d29cc4785 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/TransactionAwareDataSourceProxy.java @@ -203,10 +203,6 @@ public class TransactionAwareDataSourceProxy extends DelegatingDataSource { return true; } } - else if (method.getName().equals("getWarnings") || method.getName().equals("clearWarnings")) { - // Avoid creation of target Connection on pre-close cleanup (e.g. in Hibernate Session) - return null; - } else if (method.getName().equals("close")) { // Handle close method: only close if not within a transaction. DataSourceUtils.doReleaseConnection(this.target, this.targetDataSource); @@ -218,6 +214,10 @@ public class TransactionAwareDataSourceProxy extends DelegatingDataSource { } if (this.target == null) { + if (method.getName().equals("getWarnings") || method.getName().equals("clearWarnings")) { + // Avoid creation of target Connection on pre-close cleanup (e.g. Hibernate Session) + return null; + } if (this.closed) { throw new SQLException("Connection handle already closed"); } diff --git a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java index 7939865e5c..6e3320ce5b 100644 --- a/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java +++ b/spring-jdbc/src/test/java/org/springframework/jdbc/datasource/DataSourceTransactionManagerTests.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2018 the original author or authors. + * Copyright 2002-2019 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -48,8 +48,18 @@ import org.springframework.transaction.support.TransactionSynchronizationAdapter import org.springframework.transaction.support.TransactionSynchronizationManager; import org.springframework.transaction.support.TransactionTemplate; -import static org.junit.Assert.*; -import static org.mockito.BDDMockito.*; +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertSame; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.BDDMockito.given; +import static org.mockito.BDDMockito.inOrder; +import static org.mockito.BDDMockito.mock; +import static org.mockito.BDDMockito.times; +import static org.mockito.BDDMockito.verify; +import static org.mockito.BDDMockito.willThrow; /** * @author Juergen Hoeller @@ -117,6 +127,7 @@ public class DataSourceTransactionManagerTests { if (lazyConnection) { given(con.getAutoCommit()).willReturn(autoCommit); given(con.getTransactionIsolation()).willReturn(Connection.TRANSACTION_READ_COMMITTED); + given(con.getWarnings()).willThrow(new SQLException()); } if (!lazyConnection || createStatement) { @@ -142,6 +153,10 @@ public class DataSourceTransactionManagerTests { if (createStatement) { tCon.createStatement(); } + else { + tCon.getWarnings(); + tCon.clearWarnings(); + } } catch (SQLException ex) { throw new UncategorizedSQLException("", "", ex); @@ -669,7 +684,6 @@ public class DataSourceTransactionManagerTests { SQLException failure = new SQLException(); given(ds2.getConnection()).willThrow(failure); - final TransactionTemplate tt = new TransactionTemplate(tm); tt.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRES_NEW); @@ -974,12 +988,12 @@ public class DataSourceTransactionManagerTests { ordered.verify(con).setAutoCommit(false); ordered.verify(con).setAutoCommit(true); verify(con).close(); - } @Test public void testTransactionAwareDataSourceProxy() throws Exception { given(con.getAutoCommit()).willReturn(true); + given(con.getWarnings()).willThrow(new SQLException()); TransactionTemplate tt = new TransactionTemplate(tm); assertTrue("Hasn't thread connection", !TransactionSynchronizationManager.hasResource(ds)); @@ -990,6 +1004,9 @@ public class DataSourceTransactionManagerTests { assertEquals(con, DataSourceUtils.getConnection(ds)); TransactionAwareDataSourceProxy dsProxy = new TransactionAwareDataSourceProxy(ds); try { + Connection tCon = dsProxy.getConnection(); + tCon.getWarnings(); + tCon.clearWarnings(); assertEquals(con, ((ConnectionProxy) dsProxy.getConnection()).getTargetConnection()); // should be ignored dsProxy.getConnection().close();