成人性生交大片免费看视频r_亚洲综合极品香蕉久久网_在线视频免费观看一区_亚洲精品亚洲人成人网在线播放_国产精品毛片av_久久久久国产精品www_亚洲国产一区二区三区在线播_日韩一区二区三区四区区区_亚洲精品国产无套在线观_国产免费www

主頁 > 知識庫 > 低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限

低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限

熱門標(biāo)簽:云南電商智能外呼系統(tǒng)價格 高清地圖標(biāo)注道路 外東北地圖標(biāo)注 話務(wù)外呼系統(tǒng)怎么樣 拉卡拉外呼系統(tǒng) 大眾點評星級酒店地圖標(biāo)注 智能外呼系統(tǒng)復(fù)位 400電話可以辦理嗎 臨清電話機器人

現(xiàn)象

應(yīng)用升級MySQL驅(qū)動8.0后,在并發(fā)量較高時,查看監(jiān)控打點,Druid連接池拿到連接并執(zhí)行SQL的時間大部分都超過200ms

對系統(tǒng)進(jìn)行壓測,發(fā)現(xiàn)出現(xiàn)大量線程阻塞的情況,線程dump信息如下:

"http-nio-5366-exec-48" #210 daemon prio=5 os_prio=0 tid=0x00000000023d0800 nid=0x3be9 waiting for monitor entry [0x00007fa4c1400000]
   java.lang.Thread.State: BLOCKED (on object monitor)
        at org.springframework.boot.web.embedded.tomcat.TomcatEmbeddedWebappClassLoader.loadClass(TomcatEmbeddedWebappClassLoader.java:66)
        - waiting to lock 0x0000000775af0960> (a java.lang.Object)
        at org.apache.catalina.loader.WebappClassLoaderBase.loadClass(WebappClassLoaderBase.java:1186)
        at com.alibaba.druid.util.Utils.loadClass(Utils.java:220)
        at com.alibaba.druid.util.MySqlUtils.getLastPacketReceivedTimeMs(MySqlUtils.java:372)

根因分析

public class MySqlUtils {

    public static long getLastPacketReceivedTimeMs(Connection conn) throws SQLException {
        if (class_connectionImpl == null  !class_connectionImpl_Error) {
            try {
                class_connectionImpl = Utils.loadClass("com.mysql.jdbc.MySQLConnection");
            } catch (Throwable error){
                class_connectionImpl_Error = true;
            }
        }

        if (class_connectionImpl == null) {
            return -1;
        }

        if (method_getIO == null  !method_getIO_error) {
            try {
                method_getIO = class_connectionImpl.getMethod("getIO");
            } catch (Throwable error){
                method_getIO_error = true;
            }
        }

        if (method_getIO == null) {
            return -1;
        }

        if (class_MysqlIO == null  !class_MysqlIO_Error) {
            try {
                class_MysqlIO = Utils.loadClass("com.mysql.jdbc.MysqlIO");
            } catch (Throwable error){
                class_MysqlIO_Error = true;
            }
        }

        if (class_MysqlIO == null) {
            return -1;
        }

        if (method_getLastPacketReceivedTimeMs == null  !method_getLastPacketReceivedTimeMs_error) {
            try {
                Method method = class_MysqlIO.getDeclaredMethod("getLastPacketReceivedTimeMs");
                method.setAccessible(true);
                method_getLastPacketReceivedTimeMs = method;
            } catch (Throwable error){
                method_getLastPacketReceivedTimeMs_error = true;
            }
        }

        if (method_getLastPacketReceivedTimeMs == null) {
            return -1;
        }

        try {
            Object connImpl = conn.unwrap(class_connectionImpl);
            if (connImpl == null) {
                return -1;
            }

            Object mysqlio = method_getIO.invoke(connImpl);
            Long ms = (Long) method_getLastPacketReceivedTimeMs.invoke(mysqlio);
            return ms.longValue();
        } catch (IllegalArgumentException e) {
            throw new SQLException("getLastPacketReceivedTimeMs error", e);
        } catch (IllegalAccessException e) {
            throw new SQLException("getLastPacketReceivedTimeMs error", e);
        } catch (InvocationTargetException e) {
            throw new SQLException("getLastPacketReceivedTimeMs error", e);
        }
    }

MySqlUtils中的getLastPacketReceivedTimeMs()方法會加載com.mysql.jdbc.MySQLConnection這個類,但在MySQL驅(qū)動8.0中類名改為com.mysql.cj.jdbc.ConnectionImpl,所以MySQL驅(qū)動8.0中加載不到com.mysql.jdbc.MySQLConnection

getLastPacketReceivedTimeMs()方法實現(xiàn)中,如果Utils.loadClass("com.mysql.jdbc.MySQLConnection")加載不到類并拋出異常,會修改變量class_connectionImpl_Error,下次調(diào)用不會再進(jìn)行加載

public class Utils {

    public static Class?> loadClass(String className) {
        Class?> clazz = null;

        if (className == null) {
            return null;
        }

        try {
            return Class.forName(className);
        } catch (ClassNotFoundException e) {
            // skip
        }

        ClassLoader ctxClassLoader = Thread.currentThread().getContextClassLoader();
        if (ctxClassLoader != null) {
            try {
                clazz = ctxClassLoader.loadClass(className);
            } catch (ClassNotFoundException e) {
                // skip
            }
        }

        return clazz;
    }

但是,在Utils的loadClass()方法中同樣catch了ClassNotFoundException,這就導(dǎo)致loadClass()在加載不到類的時候,并不會拋出異常,從而會導(dǎo)致每調(diào)用一次getLastPacketReceivedTimeMs()方法,就會加載一次MySQLConnection這個類

線程dump信息中可以看到是在調(diào)用TomcatEmbeddedWebappClassLoader的loadClass()方法時,導(dǎo)致線程阻塞的

public class TomcatEmbeddedWebappClassLoader extends ParallelWebappClassLoader {

 public Class?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
  synchronized (JreCompat.isGraalAvailable() ? this : getClassLoadingLock(name)) {
   Class?> result = findExistingLoadedClass(name);
   result = (result != null) ? result : doLoadClass(name);
   if (result == null) {
    throw new ClassNotFoundException(name);
   }
   return resolveIfNecessary(result, resolve);
  }
 }

這是因為TomcatEmbeddedWebappClassLoader在加載類的時候,會加synchronized鎖,這就導(dǎo)致每調(diào)用一次getLastPacketReceivedTimeMs()方法,就會加載一次com.mysql.jdbc.MySQLConnection,而又始終加載不到,在加載類的時候會加synchronized鎖,所以會出現(xiàn)線程阻塞,性能下降的現(xiàn)象

getLastPacketReceivedTimeMs()方法調(diào)用時機

public abstract class DruidAbstractDataSource extends WrapperAdapter implements DruidAbstractDataSourceMBean, DataSource, DataSourceProxy, Serializable {

    protected boolean testConnectionInternal(DruidConnectionHolder holder, Connection conn) {
        String sqlFile = JdbcSqlStat.getContextSqlFile();
        String sqlName = JdbcSqlStat.getContextSqlName();

        if (sqlFile != null) {
            JdbcSqlStat.setContextSqlFile(null);
        }
        if (sqlName != null) {
            JdbcSqlStat.setContextSqlName(null);
        }
        try {
            if (validConnectionChecker != null) {
                boolean valid = validConnectionChecker.isValidConnection(conn, validationQuery, validationQueryTimeout);
                long currentTimeMillis = System.currentTimeMillis();
                if (holder != null) {
                    holder.lastValidTimeMillis = currentTimeMillis;
                    holder.lastExecTimeMillis = currentTimeMillis;
                }

                if (valid  isMySql) { // unexcepted branch
                    long lastPacketReceivedTimeMs = MySqlUtils.getLastPacketReceivedTimeMs(conn);
                    if (lastPacketReceivedTimeMs > 0) {
                        long mysqlIdleMillis = currentTimeMillis - lastPacketReceivedTimeMs;
                        if (lastPacketReceivedTimeMs > 0 //
                                 mysqlIdleMillis >= timeBetweenEvictionRunsMillis) {
                            discardConnection(holder);
                            String errorMsg = "discard long time none received connection. "
                                    + ", jdbcUrl : " + jdbcUrl
                                    + ", jdbcUrl : " + jdbcUrl
                                    + ", lastPacketReceivedIdleMillis : " + mysqlIdleMillis;
                            LOG.error(errorMsg);
                            return false;
                        }
                    }
                }

                if (valid  onFatalError) {
                    lock.lock();
                    try {
                        if (onFatalError) {
                            onFatalError = false;
                        }
                    } finally {
                        lock.unlock();
                    }
                }

                return valid;
            }

            if (conn.isClosed()) {
                return false;
            }

            if (null == validationQuery) {
                return true;
            }

            Statement stmt = null;
            ResultSet rset = null;
            try {
                stmt = conn.createStatement();
                if (getValidationQueryTimeout() > 0) {
                    stmt.setQueryTimeout(validationQueryTimeout);
                }
                rset = stmt.executeQuery(validationQuery);
                if (!rset.next()) {
                    return false;
                }
            } finally {
                JdbcUtils.close(rset);
                JdbcUtils.close(stmt);
            }

            if (onFatalError) {
                lock.lock();
                try {
                    if (onFatalError) {
                        onFatalError = false;
                    }
                } finally {
                    lock.unlock();
                }
            }

            return true;
        } catch (Throwable ex) {
            // skip
            return false;
        } finally {
            if (sqlFile != null) {
                JdbcSqlStat.setContextSqlFile(sqlFile);
            }
            if (sqlName != null) {
                JdbcSqlStat.setContextSqlName(sqlName);
            }
        }
    }

只有DruidAbstractDataSource的testConnectionInternal()方法中會調(diào)用getLastPacketReceivedTimeMs()方法

testConnectionInternal()是用來檢測連接是否有效的,在獲取連接和歸還連接時都有可能會調(diào)用該方法,這取決于Druid檢測連接是否有效的參數(shù)

Druid檢測連接是否有效的參數(shù):

  • testOnBorrow:每次獲取連接時執(zhí)行validationQuery檢測連接是否有效(會影響性能)
  • testOnReturn:每次歸還連接時執(zhí)行validationQuery檢測連接是否有效(會影響性能)
  • testWhileIdle:申請連接的時候檢測,如果空閑時間大于timeBetweenEvictionRunsMillis,執(zhí)行validationQuery檢測連接是否有效
  • 應(yīng)用中設(shè)置了testOnBorrow=true,每次獲取連接時,都會去搶占synchronized鎖,所以性能下降的很明顯

解決方案

經(jīng)驗證,使用Druid 1.x版本=1.1.22會出現(xiàn)該bug,解決方案就是升級至Druid 1.x版本>=1.1.23或者Druid 1.2.x版本

GitHub issue:https://github.com/alibaba/druid/issues/3808

到此這篇關(guān)于低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限的文章就介紹到這了,更多相關(guān)MySQL驅(qū)動8.0低版本Druid連接池內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • MySQL 8.0 驅(qū)動與阿里druid版本兼容問題解決
  • MySql 8.0及對應(yīng)驅(qū)動包匹配的注意點說明
  • 關(guān)于Mysql8.0版本驅(qū)動getTables返回所有庫的表問題淺析
  • 詳解Mybatis逆向工程中使用Mysql8.0版本驅(qū)動遇到的問題

標(biāo)簽:三明 揚州 定西 阿里 無錫 溫州 山西 福州

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限》,本文關(guān)鍵詞  低,版本,Druid,連接,池,+MySQL,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限》相關(guān)的同類信息!
  • 本頁收集關(guān)于低版本Druid連接池+MySQL驅(qū)動8.0導(dǎo)致線程阻塞、性能受限的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    国产盗摄视频一区二区三区| 免费在线观看av| 免费观看a级片| 免费无码毛片一区二三区| 国产.com| 九九九九久久久久| 大胆高清日本a视频| 草草视频在线一区二区| 22288色视频在线观看| 亚洲九九视频| 中文字幕激情视频| 国产精品一区二区三区在线免费观看| 男人靠女人免费视频网站| 亚洲一区二区三区不卡国产欧美| 亚洲成人a级片| 一区二区三区 在线观看视频| 天天摸天天舔天天操| 99热免费在线观看| 99这里都是精品| 国产又粗又猛视频免费| 天堂在线网站| 久久嫩草精品久久久精品一| 欧美韩国日本| 日本性视频网| 国产老女人乱淫免费| 91精品久久久久久久久久久久久| 草久久免费视频| 久久视频免费在线观看| 亚洲婷婷综合色高清在线| 亚洲精品tv久久久久久久久久| 国产精品被窝福利一区| 亚洲色图欧美自拍| 亚洲欧美中文日韩在线v日本| 曰批又黄又爽免费视频| 中文字幕在线2021| 欧美97人人模人人爽人人喊视频| 国产美女喷水视频| 97国产超碰| 91久久人澡人人添人人爽欧美| 亚洲国产美国国产综合一区二区| 色视频在线观看福利| 91www成人久久| 妺妺窝人体色www在线小说| 久草综合在线观看| 最新二区三区av| wwwww在线观看免费视频| 日韩午夜激情av| 成人在线视频免费播放| 精品国产一二三区| 国产精品久久久久9999小说| 国产亚洲精品久久久久久打不开| jizz免费| 国产精品久久久久毛片大屁完整版| 欧美乱大交xxxxx另类| 啊v在线视频| 国产精品一区二区在线观看不卡| 青青操视频在线| 国产精品免费在线视频| 国产富婆一级全黄大片| 91精品国产成人观看| 日本女优一区| 久久久精品视频在线| 黄色一级视频在线观看| 国产69精品久久久| 性生活免费网站| 男女男精品视频网站| 激情久久婷婷| 少妇免费毛片久久久久久久久| 欧美三日本三级少妇99| 青青草华人在线视频| 老女人性生活视频| 亚在线播放中文视频| 精品视频在线一区| 9999精品免费视频| 欧美调教视频| 日本a在线天堂| 中文字幕成人一区| 久久精品国产理论片免费| 欧美国产日韩电影| 91精品啪在线观看国产爱臀| 国产美女免费视频| 欧美特黄aaaaaaaa大片| 亚洲精品动漫久久久久| 成人免费一区二区三区| 国产乱色精品成人免费视频| 81精品国产乱码久久久久久| 韩国一区二区三区美女美女秀| 欧美高清在线精品一区| 妺妺窝人体色www看人体| 亚洲欧美制服综合另类| 亚洲私人黄色宅男| 亚洲视频狠狠干| 国产激情综合五月久久| 男人添女人下面高潮视频| 国户精品久久久久久久久久久不卡| 蜜臀久久99精品久久久久久| 香蕉视频网站在线观看| 日本电影中文字幕| 国产一区二区日韩精品欧美精品| 欧美男人的天堂| 99久久婷婷| 在线观看亚洲大片短视频| 国产伦精品一区二区三区在线观看| www免费视频观看在线| 国产精品美女一区| 国产精品久久毛片av大全日韩| 男人天堂久久| 亚洲欧美中文字幕在线观看| 中文字幕精品在线视频| 青青视频在线免费观看| 成人女保姆的销魂服务| 国产美女福利视频| 国产又大又长又粗又黄| 在线看视频不卡| 色偷偷亚洲女人天堂观看欧| 欧美日韩在线一区二区三区| 亚洲日本一区二区三区在线不卡| 日韩一级免费毛片| 黄页大全在线免费观看| 成年人影院在线观看| 蜜臀av色欲a片无码精品一区| 136fldh精品导航福利| 中文字幕第八页| 国产成人一区在线| 久热这里只精品99re8久| 欧美特黄视频| 国产成人福利在线| 亚洲视频高清| 久久久www| 97色婷婷成人综合在线观看| 视频一区在线免费看| 欧美日韩精品久久久免费观看| 亚洲欧美视频一区二区| 国产在线精品一区二区中文| 亚洲午夜日本在线观看| 欧美aaaxxxx做受视频| 久久精品99国产国产精| 热久久久久久久久| 亚洲av无一区二区三区| 欧美三级电影一区二区三区| 欧美日韩一卡二卡| 26uuu另类欧美亚洲曰本| 久久裸体视频| 视频一区中文字幕国产| 亚洲av综合一区二区| 色一情一乱一伦一区二区三区| 亚洲视频综合网| aaa大片免费观看| 一本色道88久久加勒比精品| 亚洲激情欧美激情| 国产精品久久久av久久久| 日本国产一区| 黄色动漫网站入口| 99精品在线免费观看| 蜜桃精品视频在线观看| 色综合久久综合中文综合网| 性爱在线免费视频| 亚洲欧美视频在线观看| 亚洲一二三区不卡| 99精品在免费线中文字幕网站一区| 欧洲xxxxx| 亚洲精品videosex极品| 国产伦精品一区二区三区妓女| 黑人巨大精品欧美一区二区一视频| 久久精品国产sm调教网站演员| 亚洲精品国产美女| 亚洲综合视频在线观看| www.欧美com| 国产成人一区二区在线| 啪啪国产精品| 五月天av在线播放| 国模视频一区二区三区| 国产自产高清不卡| 国产一级视频在线观看| 欧美区国产区| 中文字幕日韩欧美精品高清在线| 青青青国产精品一区二区| 国产女同互慰高潮91漫画| 不卡av中文字幕| 91中文在线观看| 久久一区二区免费播放| 婷婷激情综合| 一本色道综合久久欧美日韩精品| 亚洲欧美日本国产专区一区| 国产一卡二卡在线| 久久久久香蕉视频| 中文字幕永久在线观看| 欧美午夜视频网站| caoporn超碰97| 久久国产精品久久久久久| www.av一区视频| 亚洲最大激情中文字幕| 欧美性猛交 xxxx| 欧美另类老肥妇| 久草在线免费福利资源| 久久久女女女女999久久| av在线网页| 懂色av一区二区三区| 白白色免费视频| 国产成人精彩在线视频九色| 99久久亚洲精品| 国产精品一区二区三区不卡| 伪装者在线观看完整版免费| 国产精品免费观看视频| 欧美日一区二区| 精品国产91久久久久久浪潮蜜月| 久久久久久久久一| 日韩精品视频一二三| 最新av在线播放| 伊人网在线视频观看| 日韩国产高清一区| 在线国产视频一区| 在线免费看黄视频| av在线亚洲色图| 亚洲精品福利免费在线观看| 日本一道在线观看| 亚洲综合免费视频| 免费成人深夜夜行视频| 麻豆成全视频免费观看在线看| 天堂中文а√在线| 中文字幕中文字幕99| 91看片在线播放| 147欧美人体大胆444| 欧美在线观看你懂的| 日本高清免费在线视频| 久久成人综合| 春意影院普通入口| 国产黄在线免费观看| 久久国产精品系列| 色综合手机在线| 亚洲视频一区二区三区四区| 日韩大片在线观看| 97久久久久久久| 久久日.com| 亚洲国产精品成人综合色在线婷婷| 欧美一卡2卡3卡4卡| 亚洲电影在线观看| 中文字幕免费观看视频| aaa级精品久久久国产片| 日韩成人手机在线| 国产美女精品免费电影| av在线免费不卡| 国产高清精品一区二区三区| 欧美精品一二三四| 捆绑调教日本一区二区三区| 91精品久久久久久久久不口人| 成人在线免费观看| 黑人巨大精品欧美一区二区桃花岛| 57pao国产成永久免费视频| 性猛交xxxx乱大交孕妇印度| theporn国产在线精品| 亚洲国产国产| 欧美色手机在线观看| 91视频论坛| 亚洲网站在线免费观看| 成人a视频在线| 在线观看亚洲成人| 欧美a大片欧美片| 亚洲免费视频中文字幕| 99久久自偷自偷国产精品不卡| 日韩视频免费在线播放| 97色婷婷成人综合在线观看| 国产精品一区一区| 北岛玲heyzo一区二区| 亚洲老板91色精品久久| 国产精品国产一区二区| 在线播放国产一区| 欧美电影《睫毛膏》| 久久99国产精品久久99小说| 欧美亚洲天堂网| 国产精品久久久久久一区二区三区| 玉米视频成人免费看| 色综合久久88色综合天天免费| 日本在线中文字幕一区二区三区| 亚洲精品自拍偷拍| 999久久久精品一区二区| 91国产视频在线| www视频完整版| 日韩五码在线观看| 国产乱精品一区二区三区| av中文在线观看| 精品成人私密视频| 四虎影视2018在线播放alocalhost| 欧美中文字幕亚洲一区二区va在线| 三级毛片网站| 91黄色在线视频| 久久午夜国产精品| 两个人hd高清在线观看| 91香蕉视频污版| 成人爱爱电影网址| 国产成人福利夜色影视| 国产精品久久久久久av| 欧美性xxxx禁忌| 91亚洲永久免费精品| 六月天色婷婷| 91超碰国产精品| 91精品国产福利尤物| 久久亚洲国产精品| 色婷五月综激情亚洲综合| 美女一区二区视频| av综合在线观看| 四虎成人影院网址| 超碰av女优在线| 国产精品66| 亚洲涩涩在线观看| 国产精选一区| 一区视频网站| 国产在线视精品麻豆| 国产精品久久久久影院老司| 麻豆福利视频| 日本韩国精品一区二区在线观看| 国产又爽又黄的视频| 激情久久久久久| 欧美日韩中文国产| 色在人av网站天堂精品| 亚洲精品电影在线观看| 亚洲av无码国产精品久久| 午夜在线免费视频| 刘玥91精选国产在线观看| 国产精品7m凸凹视频分类| 视频二区不卡| 99国产精品欲| 亚洲精品麻豆| 欧美一区 二区 三区| 国产美女做爰免费视频软件| 欧美哺乳videos| 免费激情视频在线观看| 91精品久久久久久久久久久|