From d6e1a4a26a4bb583f2da3e20c5eda30ec995b5fb Mon Sep 17 00:00:00 2001 From: Juergen Hoeller Date: Thu, 8 Nov 2012 23:37:14 +0100 Subject: [PATCH] LocalDataSourceConnectionProvider checks against SmartDataSource before closing a Connection Issue: SPR-9978 --- .../jdbc/datasource/DataSourceUtils.java | 18 +++++++++++++----- .../LocalDataSourceConnectionProvider.java | 10 ++++++---- 2 files changed, 19 insertions(+), 9 deletions(-) diff --git a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java index d6c57f9aee9..12637d95475 100644 --- a/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java +++ b/spring-jdbc/src/main/java/org/springframework/jdbc/datasource/DataSourceUtils.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2010 the original author or authors. + * Copyright 2002-2012 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. @@ -316,7 +316,6 @@ public abstract class DataSourceUtils { if (con == null) { return; } - if (dataSource != null) { ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource); if (conHolder != null && connectionEquals(conHolder, con)) { @@ -325,11 +324,20 @@ public abstract class DataSourceUtils { return; } } + logger.debug("Returning JDBC Connection to DataSource"); + doCloseConnection(con, dataSource); + } - // Leave the Connection open only if the DataSource is our - // special SmartDataSoruce and it wants the Connection left open. + /** + * Close the Connection, unless a {@link SmartDataSource} doesn't want us to. + * @param con the Connection to close if necessary + * @param dataSource the DataSource that the Connection was obtained from + * @throws SQLException if thrown by JDBC methods + * @see Connection#close() + * @see SmartDataSource#shouldClose(Connection) + */ + public static void doCloseConnection(Connection con, DataSource dataSource) throws SQLException { if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) { - logger.debug("Returning JDBC Connection to DataSource"); con.close(); } } diff --git a/spring-orm/src/main/java/org/springframework/orm/hibernate3/LocalDataSourceConnectionProvider.java b/spring-orm/src/main/java/org/springframework/orm/hibernate3/LocalDataSourceConnectionProvider.java index 29a711b3337..498c53c6b7f 100644 --- a/spring-orm/src/main/java/org/springframework/orm/hibernate3/LocalDataSourceConnectionProvider.java +++ b/spring-orm/src/main/java/org/springframework/orm/hibernate3/LocalDataSourceConnectionProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2002-2009 the original author or authors. + * Copyright 2002-2012 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. @@ -25,6 +25,8 @@ import org.hibernate.HibernateException; import org.hibernate.connection.ConnectionProvider; import org.hibernate.util.JDBCExceptionReporter; +import org.springframework.jdbc.datasource.DataSourceUtils; + /** * Hibernate connection provider for local DataSource instances * in an application context. This provider will be used if @@ -87,12 +89,12 @@ public class LocalDataSourceConnectionProvider implements ConnectionProvider { } /** - * This implementation simply calls Connection.close. - * @see java.sql.Connection#close() + * This implementation calls {@link DataSourceUtils#doCloseConnection}, + * checking against a {@link org.springframework.jdbc.datasource.SmartDataSource}. */ public void closeConnection(Connection con) throws SQLException { try { - con.close(); + DataSourceUtils.doCloseConnection(con, this.dataSourceToUse); } catch (SQLException ex) { JDBCExceptionReporter.logExceptions(ex);