首页 > 数据库 >MySQL Others--优化autocommit会话参数设置请求

MySQL Others--优化autocommit会话参数设置请求

时间:2023-04-06 19:56:16浏览次数:38  
标签:autocommit SET return -- 参数设置 MySQL method 连接池

问题描述

在排查QPS较高的MySQL集群过程中发现,部分MySQL集群约50%的请求为"SET autocommit=1",每次业务请求前都会执行1次"SET autocommit=1"操作,虽然单次”SET autocommit=1“操作并不会消耗过多MySQL服务器资源,但高QPS场景下频繁执行"SET autocommit=1"操作,严重浪费应用服务器和MySQL服务器端的服务器资源,同时增加应用服务器MySQL请求延迟。

问题原因

在TCDev提供的MySQL客户端中,每次调用com.qunar.db.resource.RWDelegatorDataSource使用getConnection()方法从连接池获取连接都会先使用setAutoCommit方法来对要返回的连接设置AutoCommit属性:

public Connection getConnection() throws SQLException {
    Connection connection = new IsolateConnection(this);

    try {
        connection.setAutoCommit(this.autoCommit);
        return connection;
    } catch (SQLException var3) {
        this.logger().error("get connection failed:", var3);
        Utils.close(connection);
        throw var3;
    }
}

对于Tomcat连接池,会触发调用org.apache.tomcat.jdbc.pool.DisposableConnectionFacade下面的invoke方法来设置:

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
    if (this.compare("equals", method)) {
        return this.equals(Proxy.getInvocationHandler(args[0]));
    } else if (this.compare("hashCode", method)) {
        return this.hashCode();
    } else {
        if (this.getNext() == null) {
            if (this.compare("isClosed", method)) {
                return Boolean.TRUE;
            }

            if (this.compare("close", method)) {
                return null;
            }

            if (this.compare("isValid", method)) {
                return Boolean.FALSE;
            }
        }

        String var5;
        try {
            try {
                Object var4 = super.invoke(proxy, method, args);
                return var4;
            } catch (NullPointerException var9) {
                if (this.getNext() != null) {
                    throw var9;
                }
            }

            if (!this.compare("toString", method)) {
                throw new SQLException("PooledConnection has already been closed.");
            }

            var5 = "DisposableConnectionFacade[null]";
        } finally {
            if (this.compare("close", method)) {
                this.setNext((JdbcInterceptor)null);
            }

        }

        return var5;
    }
}

对于Druid连接池,会触发调用com.alibaba.druid.pool.DruidPooledConnection中的setAutoCommit方法:

public void setAutoCommit(boolean autoCommit) throws SQLException {
    this.checkState();
    boolean useLocalSessionState = this.holder.getDataSource().isUseLocalSessionState();
    if (!useLocalSessionState || autoCommit != this.holder.underlyingAutoCommit) {
        try {
            this.conn.setAutoCommit(autoCommit);
            this.holder.setUnderlyingAutoCommit(autoCommit);
            this.holder.setLastExecTimeMillis(System.currentTimeMillis());
        } catch (SQLException var4) {
            this.handleException(var4, (String)null);
        }

    }
}

Tomcat连接池会直接向MySQL服务器发送SET命令,而Druid连接池会根据当前连接在本地缓存的AutoCommit属性值来判断是否需要向MySQL服务器发送SET命令,由于大部分应用都不会显式调整autocommit的属性值,连接池中的MySQL连接会长期保持相同的值,因此Druid连接池能避免重复执行"SET autocommit=1"操作,有效降低"SET autocommit=1"操作的执行频率。

优化建议

  • 对于MySQL请求QPS较高的服务,建议将底层MySQL连接池从Tomcat连接池和HikariCP连接池调整为Druid连接池。

标签:autocommit,SET,return,--,参数设置,MySQL,method,连接池
From: https://www.cnblogs.com/gaogao67/p/17293963.html

相关文章

  • 欧几里得算法
    欧几里得算法(Euclid)最大公约数\(gcd(a,b)\)intgcd(inta,intb){while(b){swap(a,b);b%=a;}returna;}//---or---intgcd(inta,intb){return(b==0?a:gcd(b,a%b));}最小公倍数\(lcm(a,b)\)intlcm(inta,intb){......
  • static关键字,main方法,代码块,final关键字
    static关键字,main()方法,代码块,final关键字static关键字的使用:static:静态的static可以修饰:属性、方法、代码块、内部类使用static修饰的变量:静态变量(类变量)3.1属性:实例变量:我们创建了多个类的对象,每个对象都拥有一套独立的类的非静态属性,当修改其中一个对象的非静......
  • 记录一次Mac通过frp内网穿透远程连接开发板的图形化桌面的操作过程
    简介使用Mac通过frp内网穿透远程连接开发板的图形化桌面,觉得比较有趣,记录成文PS:家里屏幕有限,公司里也一样,所以在开发板运行一些基础程序,需要用到一些图形化程序。(比如shellclash就没跑通,需要换一个图形化程序)前置准备硬件:macbookpro2020tinkerBoard2s,OperatingSys......
  • 超详细!手把手教你用 JaCoCo 生成单测覆盖率报告!
    我们都知道Spock是一个单测框架,其特点是语法简明。但当我们使用Spock写了一堆单元测试之后,如何生成对应的单测覆盖率报告呢?一般来说,我们会使用两个插件来一起完成单测覆盖率报告的生成,分别是:MavenSurefirePluginJaCoCoPlugin其中MavenSurefirePlugin是用来在Mave......
  • jquery 根据开始日期加天数计算有效期
    functiondateTime(startDate,dayTime){//起始日期,天数  vardate=newDate(startDate);  varnewDate=newDate(date.getFullYear(),date.getMonth(),date.getDate()+dayTime);  varyear1=date.getFullYear();  varmonth1=date.getMonth()+1;  var......
  • 机器学习数学基础之信息论
    信息论背后的原理是:从不太可能发生的事件中能学到更多的有用信息。发生可能性较大的事件包含较少的信息发生可能性较小的事件包含较多的信息独立事件包含额外的信息对于事件\(\mathbfx=x\),定义自信息self-information为:\[I(x)=-\logP(x)\]自信息仅仅处理单个输出。如果......
  • c++字符串拆分
    1staticvoidSplitString(conststring&data,conststring&delim,2std::vector<string>*result){3std::string::size_typepos;4constintsize=data.size();56for(intindex=0;index<size;++index)......
  • 1658. 将 x 减到 0 的最小操作数
    题目描述给一个整数数组nums和整数x需要从数组的左边或者右边删除元素,然后用x减去删除的元素问如果x刚好成删到0,怎么删最短?f1-反向思考+双指针基本分析反向思考?找一个最长的子数组满足和=sum(nums)-x为啥可以双指针?(1)元素都是整数,序列和是单调的;(2)元素连续代码def......
  • 质数筛
    内容来自b站importjava.util.Arrays;importjava.util.Scanner;publicclass质数筛{ staticintN=100000010; staticboolean[]vis=newboolean[N];//划掉合数 staticint[]prim=newint[N];//记录质数 staticintcnt=0;//质数个数 publicstat......
  • 从3s到25ms!看看人家的接口优化技巧,确实很优雅!!
    转载链接地址:https://mp.weixin.qq.com/s/7qcXDTiVIWAowlGJ_AQ6nA大家好,最近看到京东云的一位大佬分享的接口优化方案,感觉挺不错的,拿来即用。建议收藏一波或者整理到自己的笔记本中,随时查阅!下面是正文。一、背景   针对老项目,去年做了许多降本增效的事情,其中发现最多的......