HibernateJpaDialect logs warning in case of Connection mismatch (e.g. configured release mode other than ON_CLOSE)
Related to that, HibernateTransactionManager specifically checks for active physical connections on reset as of Hibernate 5. Issue: SPR-13269 Issue: SPR-13002
This commit is contained in:
@@ -22,6 +22,7 @@ import java.sql.SQLException;
|
||||
import javax.persistence.EntityManager;
|
||||
import javax.persistence.PersistenceException;
|
||||
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
import org.hibernate.FlushMode;
|
||||
import org.hibernate.HibernateException;
|
||||
import org.hibernate.NonUniqueObjectException;
|
||||
@@ -146,13 +147,12 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
|
||||
|
||||
boolean isolationLevelNeeded = (definition.getIsolationLevel() != TransactionDefinition.ISOLATION_DEFAULT);
|
||||
Integer previousIsolationLevel = null;
|
||||
boolean resetConnection = false;
|
||||
Connection preparedCon = null;
|
||||
|
||||
if (isolationLevelNeeded || definition.isReadOnly()) {
|
||||
if (this.prepareConnection) {
|
||||
Connection con = HibernateConnectionHandle.doGetConnection(session);
|
||||
previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(con, definition);
|
||||
resetConnection = true;
|
||||
preparedCon = HibernateConnectionHandle.doGetConnection(session);
|
||||
previousIsolationLevel = DataSourceUtils.prepareConnectionForTransaction(preparedCon, definition);
|
||||
}
|
||||
else if (isolationLevelNeeded) {
|
||||
throw new InvalidIsolationLevelException(getClass().getSimpleName() +
|
||||
@@ -167,7 +167,7 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
|
||||
|
||||
// Adapt flush mode and store previous isolation level, if any.
|
||||
FlushMode previousFlushMode = prepareFlushMode(session, definition.isReadOnly());
|
||||
return new SessionTransactionData(session, previousFlushMode, resetConnection, previousIsolationLevel);
|
||||
return new SessionTransactionData(session, previousFlushMode, preparedCon, previousIsolationLevel);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -176,7 +176,7 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
|
||||
|
||||
Session session = getSession(entityManager);
|
||||
FlushMode previousFlushMode = prepareFlushMode(session, readOnly);
|
||||
return new SessionTransactionData(session, previousFlushMode, false, null);
|
||||
return new SessionTransactionData(session, previousFlushMode, null, null);
|
||||
}
|
||||
|
||||
protected FlushMode prepareFlushMode(Session session, boolean readOnly) throws PersistenceException {
|
||||
@@ -321,15 +321,15 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
|
||||
|
||||
private final FlushMode previousFlushMode;
|
||||
|
||||
private final boolean resetConnection;
|
||||
private final Connection preparedCon;
|
||||
|
||||
private final Integer previousIsolationLevel;
|
||||
|
||||
public SessionTransactionData(
|
||||
Session session, FlushMode previousFlushMode, boolean resetConnection, Integer previousIsolationLevel) {
|
||||
Session session, FlushMode previousFlushMode, Connection preparedCon, Integer previousIsolationLevel) {
|
||||
this.session = session;
|
||||
this.previousFlushMode = previousFlushMode;
|
||||
this.resetConnection = resetConnection;
|
||||
this.preparedCon = preparedCon;
|
||||
this.previousIsolationLevel = previousIsolationLevel;
|
||||
}
|
||||
|
||||
@@ -337,9 +337,15 @@ public class HibernateJpaDialect extends DefaultJpaDialect {
|
||||
if (this.previousFlushMode != null) {
|
||||
this.session.setFlushMode(this.previousFlushMode);
|
||||
}
|
||||
if (this.resetConnection && this.session.isConnected()) {
|
||||
Connection con = HibernateConnectionHandle.doGetConnection(this.session);
|
||||
DataSourceUtils.resetConnectionAfterTransaction(con, this.previousIsolationLevel);
|
||||
if (this.preparedCon != null && this.session.isConnected()) {
|
||||
Connection conToReset = HibernateConnectionHandle.doGetConnection(this.session);
|
||||
if (conToReset != this.preparedCon) {
|
||||
LogFactory.getLog(HibernateJpaDialect.class).warn(
|
||||
"JDBC Connection to reset not identical to originally prepared Connection - please " +
|
||||
"make sure to use connection release mode ON_CLOSE (the default) and to run against " +
|
||||
"Hibernate 4.2+ (or switch HibernateJpaDialect's prepareConnection flag to false");
|
||||
}
|
||||
DataSourceUtils.resetConnectionAfterTransaction(conToReset, this.previousIsolationLevel);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user