diff --git a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java index 5adb2527b2..63b0326979 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java +++ b/src/main/java/com/alibaba/druid/pool/DruidAbstractDataSource.java @@ -231,12 +231,24 @@ public abstract class DruidAbstractDataSource extends WrapperAdapter implements private Boolean useUnfairLock = null; + private boolean useLocalSessionState = true; + public DruidAbstractDataSource(boolean lockFair){ lock = new ReentrantLock(lockFair); notEmpty = lock.newCondition(); empty = lock.newCondition(); } + + public boolean isUseLocalSessionState() { + return useLocalSessionState; + } + + public void setUseLocalSessionState(boolean useLocalSessionState) { + this.useLocalSessionState = useLocalSessionState; + } + + public boolean isOracle() { return isOracle; diff --git a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java index 32ae7e4c2c..ca8ee6f142 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java +++ b/src/main/java/com/alibaba/druid/pool/DruidConnectionHolder.java @@ -195,18 +195,22 @@ public final class DruidConnectionHolder { // reset default settings if (underlyingReadOnly != defaultReadOnly) { conn.setReadOnly(defaultReadOnly); + underlyingReadOnly = defaultReadOnly; } if (underlyingHoldability != defaultHoldability) { conn.setHoldability(defaultHoldability); + underlyingHoldability = defaultHoldability; } if (underlyingTransactionIsolation != defaultTransactionIsolation) { conn.setTransactionIsolation(defaultTransactionIsolation); + underlyingTransactionIsolation = defaultTransactionIsolation; } if (underlyingAutoCommit != defaultAutoCommit) { conn.setAutoCommit(defaultAutoCommit); + underlyingAutoCommit = defaultAutoCommit; } connectionEventListeners.clear(); diff --git a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java index 8f5ac28342..47842a2cf6 100644 --- a/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java +++ b/src/main/java/com/alibaba/druid/pool/DruidPooledConnection.java @@ -671,6 +671,14 @@ public class DruidPooledConnection extends PoolableWrapper implements javax.sql. @Override public void setAutoCommit(boolean autoCommit) throws SQLException { checkState(); + + boolean useLocalSessionState = holder.getDataSource().isUseLocalSessionState(); + + if (useLocalSessionState) { + if (autoCommit == holder.isUnderlyingAutoCommit()) { + return; + } + } try { conn.setAutoCommit(autoCommit);