/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.tool.schema.internal.exec;

import java.sql.Connection;
import java.sql.SQLException;
import javax.persistence.PersistenceException;

import org.hibernate.engine.jdbc.connections.spi.ConnectionProvider;
import org.hibernate.engine.jdbc.connections.spi.JdbcConnectionAccess;

import org.jboss.logging.Logger;

Implementation of JdbcConnectionAccess for use in cases where we leverage a ConnectionProvider for access to JDBC Connections.
Author:Steve Ebersole
/** * Implementation of JdbcConnectionAccess for use in cases where we * leverage a ConnectionProvider for access to JDBC Connections. * * @author Steve Ebersole */
public class JdbcConnectionAccessConnectionProviderImpl implements JdbcConnectionAccess { private static final Logger log = Logger.getLogger( JdbcConnectionAccessConnectionProviderImpl.class ); private final ConnectionProvider connectionProvider; private final Connection jdbcConnection; private final boolean wasInitiallyAutoCommit; public JdbcConnectionAccessConnectionProviderImpl(ConnectionProvider connectionProvider) { this.connectionProvider = connectionProvider; try { this.jdbcConnection = connectionProvider.getConnection(); } catch (SQLException e) { throw new PersistenceException( "Unable to obtain JDBC Connection", e ); } boolean wasInitiallyAutoCommit; try { wasInitiallyAutoCommit = jdbcConnection.getAutoCommit(); if ( !wasInitiallyAutoCommit ) { try { jdbcConnection.setAutoCommit( true ); } catch (SQLException e) { throw new PersistenceException( String.format( "Could not set provided connection [%s] to auto-commit mode" + " (needed for schema generation)", jdbcConnection ), e ); } } } catch (SQLException ignore) { wasInitiallyAutoCommit = false; } log.debugf( "wasInitiallyAutoCommit=%s", wasInitiallyAutoCommit ); this.wasInitiallyAutoCommit = wasInitiallyAutoCommit; } @Override public Connection obtainConnection() throws SQLException { return jdbcConnection; } @Override public void releaseConnection(Connection connection) throws SQLException { if ( connection != this.jdbcConnection ) { throw new PersistenceException( String.format( "Connection [%s] passed back to %s was not the one obtained [%s] from it", connection, JdbcConnectionAccessConnectionProviderImpl.class.getName(), jdbcConnection ) ); } // Reset auto-commit if ( !wasInitiallyAutoCommit ) { try { if ( jdbcConnection.getAutoCommit() ) { jdbcConnection.setAutoCommit( false ); } } catch (SQLException e) { log.info( "Was unable to reset JDBC connection to no longer be in auto-commit mode" ); } } // Release the connection connectionProvider.closeConnection( jdbcConnection ); } @Override public boolean supportsAggressiveRelease() { return false; } }