我在MySQL数据库中遇到了一个问题,setAutocommit被记录了很多次,即使没有autocommit模式的改变。例如,如果我调用setautocommit(false)5次,我在查询日志中看到5个查询说set autommit=0;
这通常不应该发生,因为自动提交模式没有改变。只有当我将自动提交模式(如1改为0)更改时,才应发送查询。
当我查看MySQL连接类实现时,我发现他们检查useLocalSessionState值来决定是否要执行查询?

 if ((getUseLocalSessionState()) && (this.autoCommit == autoCommitFlag)) {
            needsSetOnServer = false;
          }

因此,即使this.autocommit和autocommit标志相同,needsSetOnServer也不会设置为false,因为useLocalSessionState默认为false。
一旦我在连接URL中添加useLocalSessionState=true,就不会看到不必要的查询日志。
所以,我的问题是:
useLocalSessionState的意义是什么?为什么它被普遍使用?
设置useLocalSessionState=true是否安全?
PS:我看到SQL Server处理此类场景时没有任何依赖关系,例如(SQLServerConnection中的代码片段
if (paramBoolean == this.databaseAutoCommitMode) {
      return;
    }

最佳答案

参考http://dev.mysql.com/doc/connector-j/en/connector-j-reference-configuration-properties.html
驱动程序是否应该引用由协议维护的Connection.setAutoCommit()和Connection.setTransactionIsolation()以及transaction state设置的autocommit和事务隔离的内部值,而不是查询数据库或盲目地向数据库发送commit()或rollback()方法调用的命令?
我对此的解释(在查看MySQL JDBC驱动程序的代码之后)是,它检查连接类的SELECT @@session.tx_read_only属性,而不是发出例如readOnly的命令:
ConnectionImpl.java(MySQL JDBC connectr 5.1.31版):

public boolean isReadOnly() throws SQLException {
    return this.isReadOnly(true);
}

public boolean isReadOnly(boolean useSessionStatus) throws SQLException {
    if(useSessionStatus && /*...*/ && !this.getUseLocalSessionState()) {
        //...

        rs = stmt.executeQuery("select @@session.tx_read_only");

        //...
    } else {
        return this.readOnly;
    }
}

此外,它只在useLocalSessionState为false时发出用于设置只读状态的SQL命令:
public void setReadOnlyInternal(boolean readOnlyFlag) throws SQLException {
    if((/*...*/ !this.getUseLocalSessionState()) {
        this.execSQL((StatementImpl)null, "set session transaction " + (readOnlyFlag?"read only":"read write"), -1, (Buffer)null, 1003, 1007, false, this.database, (Field[])null, false);
    }

    this.readOnly = readOnlyFlag;
}

我假设这同样适用于自动提交和事务隔离级别属性。

关于mysql - useLocalSessionState的作用是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26053654/

10-12 23:22