org.hibernate.resource.jdbc.internal.LogicalConnectionProvidedImpl Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
JPMS Module-Info's for a few of the Jakarta Libraries just until they add them in themselves
/*
* 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 .
*/
package org.hibernate.resource.jdbc.internal;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.sql.Connection;
import org.hibernate.resource.jdbc.LogicalConnection;
import org.hibernate.resource.jdbc.ResourceRegistry;
import org.hibernate.resource.jdbc.spi.LogicalConnectionImplementor;
import org.hibernate.resource.jdbc.spi.PhysicalConnectionHandlingMode;
import org.jboss.logging.Logger;
/**
* @author Steve Ebersole
*/
public class LogicalConnectionProvidedImpl extends AbstractLogicalConnectionImplementor {
private static final Logger log = Logger.getLogger( LogicalConnection.class );
private transient Connection providedConnection;
private final boolean initiallyAutoCommit;
private boolean closed;
public LogicalConnectionProvidedImpl(Connection providedConnection, ResourceRegistry resourceRegistry) {
this.resourceRegistry = resourceRegistry;
if ( providedConnection == null ) {
throw new IllegalArgumentException( "Provided Connection cannot be null" );
}
this.providedConnection = providedConnection;
this.initiallyAutoCommit = determineInitialAutoCommitMode( providedConnection );
}
private LogicalConnectionProvidedImpl(boolean closed, boolean initiallyAutoCommit) {
this.resourceRegistry = new ResourceRegistryStandardImpl();
this.closed = closed;
this.initiallyAutoCommit = initiallyAutoCommit;
}
@Override
public PhysicalConnectionHandlingMode getConnectionHandlingMode() {
return PhysicalConnectionHandlingMode.IMMEDIATE_ACQUISITION_AND_HOLD;
}
@Override
public boolean isOpen() {
return !closed;
}
@Override
public Connection close() {
log.trace( "Closing logical connection" );
getResourceRegistry().releaseResources();
try {
return providedConnection;
}
finally {
providedConnection = null;
closed = true;
log.trace( "Logical connection closed" );
}
}
@Override
public boolean isPhysicallyConnected() {
return providedConnection != null;
}
@Override
public Connection getPhysicalConnection() {
errorIfClosed();
return providedConnection;
}
@Override
public LogicalConnectionImplementor makeShareableCopy() {
errorIfClosed();
return new LogicalConnectionProvidedImpl( providedConnection, new ResourceRegistryStandardImpl() );
}
@Override
public void serialize(ObjectOutputStream oos) throws IOException {
oos.writeBoolean( closed );
oos.writeBoolean( initiallyAutoCommit );
}
public static LogicalConnectionProvidedImpl deserialize(
ObjectInputStream ois) throws IOException, ClassNotFoundException {
final boolean isClosed = ois.readBoolean();
final boolean initiallyAutoCommit = ois.readBoolean();
return new LogicalConnectionProvidedImpl( isClosed, initiallyAutoCommit );
}
@Override
public Connection manualDisconnect() {
errorIfClosed();
try {
resourceRegistry.releaseResources();
return providedConnection;
}
finally {
this.providedConnection = null;
}
}
@Override
public void manualReconnect(Connection connection) {
errorIfClosed();
if ( connection == null ) {
throw new IllegalArgumentException( "cannot reconnect using a null connection" );
}
else if ( connection == providedConnection ) {
// likely an unmatched reconnect call (no matching disconnect call)
log.debug( "reconnecting the same connection that is already connected; should this connection have been disconnected?" );
}
else if ( providedConnection != null ) {
throw new IllegalArgumentException(
"cannot reconnect to a new user-supplied connection because currently connected; must disconnect before reconnecting."
);
}
providedConnection = connection;
log.debug( "Manually reconnected logical connection" );
}
@Override
protected Connection getConnectionForTransactionManagement() {
return providedConnection;
}
@Override
protected void afterCompletion() {
afterTransaction();
resetConnection( initiallyAutoCommit );
}
}