日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術(shù)文章
文章詳情頁

SpringBoot使用 druid 連接池來優(yōu)化分頁語句

瀏覽:26日期:2023-04-11 13:08:36

一、前言

一個老系統(tǒng)隨著數(shù)據(jù)量越來越大,我們察覺到部分分頁語句拖慢了我們的速度。

鑒于老系統(tǒng)的使用方式,不打算使用pagehelper和mybatis-plus來處理,加上系統(tǒng)里使用得是druid連接池,考慮直接使用druid來優(yōu)化。

二、老代碼

老代碼是使用得一個mybatis插件進行的分頁,分頁的核心代碼如下:

// 記錄統(tǒng)計的 sqlString countSql = 'select count(0) from (' + sql+ ') tmp_count';PreparedStatement countStmt = connection.prepareStatement(countSql);BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(), countSql, boundSql.getParameterMappings(), parameterObject);setParameters(countStmt, mappedStatement, countBS,parameterObject);

在原始的 sql 外面包裝了一個 count sql,當(dāng)然很多插件都是這樣做的。

三、druid 的 PagerUtil

示例 sql(有比較復(fù)雜的坐標(biāo)計算)

SELECT g.* , ROUND(6378.138 * 2 * ASIN(SQRT(POW(SIN((? * PI() / 180 - t.latitude * PI() / 180) / 2), 2) + COS(? * PI() / 180) * COS(t.latitude * PI() / 180) * POW(SIN((? * PI() / 180 - t.longitude * PI() / 180) / 2), 2))), 2) AS distancecd , t.agentname, t.agentlogo, t.compaddressFROM t_bas_integral_goods g LEFT JOIN t_bas_agent t ON g.agentid = t.AGENTIDWHERE t.AGENTTYPE = ’2’ AND t.pass = ’0’ AND t.dl_type = ’4’ AND g.type = 0ORDER BY distancecd ASC

使用 Druid 生成 count sql:

String countSql = PagerUtils.count(sql, DbType.mysql);System.out.println(countSql);

輸出:

SELECT COUNT(*)FROM t_bas_integral_goods g LEFT JOIN t_bas_agent t ON g.agentid = t.AGENTIDWHERE t.AGENTTYPE = ’2’ AND t.pass = ’0’ AND t.dl_type = ’4’ AND g.type = 0

我們可以看到優(yōu)化后的 count sql 變得十分簡潔,坐標(biāo)計算的都已經(jīng)丟棄掉。 注意:PagerUtil還有l(wèi)imit方法用來生成limit語句,感興趣的同學(xué)可以自行試驗。

四、改造mybatis分頁插件

4.1 踩坑之路

看到上面 druid PagerUtils count 的優(yōu)化效果,立馬開始改造起來,起初只改掉了countSql,

String countSql = PagerUtils.count(sql, dbType);PreparedStatement countStmt = connection.prepareStatement(countSql);BoundSql countBS = new BoundSql(mappedStatement.getConfiguration(), countSql, boundSql.getParameterMappings(), parameterObject);setParameters(countStmt, mappedStatement, countBS,parameterObject);

啟動起來測試一番就發(fā)現(xiàn)報錯了,因為原始 sql 中含有?變量,優(yōu)化后的 sql 已經(jīng)沒有變量了,插件還會繼續(xù)給他設(shè)置變量。 我們要怎么解決這個問題呢?

我們再回頭看看pagehelper和mybatis-plus是怎么實現(xiàn)的!它倆都是基于jsqlparser對 sql 進行解析,然后處理。

要多加一個jsqlparser?沒必要沒必要,druid 的 sql 解析功能也是很強大的,我看了看PagerUtils.count方法的源碼,大不了用 druid 的 sql 解析實現(xiàn)一遍。

看了看源碼之后我陷入了沉思,有必要搞這么復(fù)雜么?有沒有更好的方法?我反復(fù) debug 發(fā)現(xiàn)了,DynamicSqlSource中有帶#{xxx}這樣的原始 sql,

那么我是否可以使用 druid 先對這種 mybatis 占位符的 sql 進行優(yōu)化呢?我們來試試:

示例 sql:

select * from xxx where type = #{type} order by xx

輸出:

SELECT COUNT(*)FROM xxxWHERE type = #{type}

完美!!! 4.2 繼續(xù)踩坑

然而直接在 Mapper 上注解的 sql 還是有問題,拿不到原始的 sql,debug 發(fā)現(xiàn) RawSqlSource 在構(gòu)造器里就將 sql 處理成了?號掛參的形式。

@Select('select * from xxx where type = #{type} order by xx')Object test(@Param('type') String type);

那么我只能看看能不能擴展它,我找到了它是在XMLLanguageDriver里進行初始化,這下好辦了,因為我之前擴展過XMLLanguageDriver,它是可以自定義配置的。 于是我重寫了RawSqlSource, 添加上了包含 mybatis 參數(shù)占位符(#{})的rawSql字段。

/** * 原始 sql,用于方便 druid 工具進行分頁 * * @author L.cm */public class MicaRawSqlSource implements SqlSource { private final String rawSql; private final SqlSource sqlSource; public MicaRawSqlSource(Configuration configuration, SqlNode rootSqlNode, Class<?> parameterType) { this(configuration, getSql(configuration, rootSqlNode), parameterType); } public MicaRawSqlSource(Configuration configuration, String sql, Class<?> parameterType) { SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration); Class<?> clazz = parameterType == null ? Object.class : parameterType; this.rawSql = sql; this.sqlSource = sqlSourceParser.parse(sql, clazz, new HashMap<>()); } // ... ...}

自此全部邏輯已經(jīng)走通,我們再來看看我們的PagePlugin核心代碼:

// 進行分頁Configuration configuration = mappedStatement.getConfiguration();SqlSourceBuilder sqlSourceParser = new SqlSourceBuilder(configuration);Class<?> parameterType = parameterObject.getClass();Connection connection = (Connection) invocation.getArgs()[0];// 1. 對 sql 進行判斷,如果沒有 ? 號,則直接處理String boundRawSql = boundSql.getSql();if (boundRawSql.indexOf(CharPool.QUESTION_MARK) == -1) { // 不包含 ? 號 String countSql = PagerUtils.count(boundRawSql, dbType); SqlSource newSqlSource = sqlSourceParser.parse(countSql, parameterType, new HashMap<>()); BoundSql newBoundSql = newSqlSource.getBoundSql(parameterObject); int count = getCount(connection, mappedStatement, parameterObject, newBoundSql); StringBuilder sqlBuilder = new StringBuilder(boundRawSql); Page page = getPageParam(parameterObject, sqlBuilder, count); String pageSql = generatePageSql(sqlBuilder.toString(), dbType, page); // 將分頁sql語句反射回BoundSql. setField(boundSql, 'sql', pageSql); return invocation.proceed();}// 2. 按 SqlSource 進行解析SqlSource sqlSource = mappedStatement.getSqlSource();// xml 中的動態(tài) sqlint count;if (sqlSource instanceof DynamicSqlSource) { SqlNode rootSqlNode = PagePlugin.getField(sqlSource, 'rootSqlNode'); DynamicContext context = new DynamicContext(configuration, parameterObject); rootSqlNode.apply(context); // 生成 count sql,帶 #{xxx} 變量的 sql String countSql = PagerUtils.count(context.getSql(), dbType); SqlSource newSqlSource = sqlSourceParser.parse(countSql, parameterType, context.getBindings()); BoundSql newBoundSql = newSqlSource.getBoundSql(parameterObject); count = getCount(connection, mappedStatement, parameterObject, newBoundSql);} else if (sqlSource instanceof MicaRawSqlSource) { String rawSql = ((MicaRawSqlSource) sqlSource).getRawSql(); DynamicContext context = new DynamicContext(configuration, parameterObject); // 生成 count sql,帶 #{xxx} 變量的 sql String countSql = PagerUtils.count(rawSql, dbType); SqlSource newSqlSource = sqlSourceParser.parse(countSql, parameterType, context.getBindings()); BoundSql newBoundSql = newSqlSource.getBoundSql(parameterObject); count = getCount(connection, mappedStatement, parameterObject, newBoundSql);} else { throw new IllegalArgumentException('不支持的 sql 分頁形式,請使用 xml 或者注解');}

五、結(jié)論

整個老服務(wù)通過切換到 mica(深度定制)的微服務(wù)架構(gòu)(演示環(huán)境僅僅在單服務(wù)低內(nèi)存配置)之后速度提升效果明顯,當(dāng)然后面我們還會繼續(xù)進行優(yōu)化。

到此這篇關(guān)于SpringBoot使用 druid 連接池來優(yōu)化分頁語句的文章就介紹到這了,更多相關(guān)SpringBoot druid 連接池分頁內(nèi)容請搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产精品久久久久9999高清| 99成人在线视频| 亚洲激情不卡| 午夜国产一区二区| 欧美一级精品| 欧美日韩精品一本二本三本| 免费观看久久av| 91精品成人| 亚洲尤物在线| 鲁大师影院一区二区三区| 亚洲一区二区三区免费在线观看| 女同性一区二区三区人了人一| 自拍日韩欧美| 亚洲精品影视| 深夜福利亚洲| 国产欧美一区二区三区精品观看| 国产精品美女在线观看直播| 久久久免费人体| 成人在线视频中文字幕| 日韩高清不卡| 99综合视频| 亚洲精品一级二级三级| 麻豆国产一区| 欧美日韩一区二区三区视频播放| 亚洲欧美日韩国产一区| 日本不卡一二三区黄网| 精品无人区麻豆乱码久久久| 蜜桃精品在线| 久久福利毛片| 18国产精品| 成人小电影网站| 午夜亚洲福利在线老司机| 亚洲+小说+欧美+激情+另类| 老司机免费视频一区二区| 成人羞羞视频在线看网址| 午夜在线精品偷拍| 青草av.久久免费一区| 韩国一区二区三区视频| 欧美日韩激情| 欧美一级全黄| 日韩电影免费在线观看| 免费在线观看一区二区三区| 国产高清精品二区| 91久久国产| 日韩高清成人在线| 六月婷婷综合| 中文字幕av一区二区三区人| 国产一区二区三区亚洲| 日韩亚洲国产欧美| 美女视频黄 久久| 影音先锋国产精品| 国产精久久一区二区| 亚洲欧美一区在线| 国产精品日本一区二区三区在线| 久久久久中文| 国产日产精品_国产精品毛片| 亚洲伦乱视频| 91福利精品在线观看| 999国产精品999久久久久久| 亚洲一区二区三区四区五区午夜| 国产极品一区| 中文不卡在线| 日韩一区三区| 欧美日韩黄网站| 在线日韩中文| 久久精品福利| 香蕉久久久久久| 亚洲成人二区| 国产精品乱战久久久| 在线亚洲一区| jizzjizz中国精品麻豆| 日韩精品视频在线看| 久久影视一区| 精品一区二区三区视频在线播放| 野花国产精品入口| 国产福利电影在线播放| 欧美在线观看天堂一区二区三区| 亚洲精品va| 黄色在线网站噜噜噜| 69精品国产久热在线观看| 9久re热视频在线精品| 午夜精品成人av| 麻豆久久久久久久| 三级久久三级久久久| 午夜国产欧美理论在线播放| 97精品一区| 国产精品地址| 亚洲精品看片| 老鸭窝毛片一区二区三区| 欧美13videosex性极品| 国产精品永久| 午夜亚洲福利| 在线精品视频一区| 91久久视频| 99久久婷婷| 成人日韩在线| 岛国av在线网站| 欧美激情综合| 青青国产精品| 婷婷成人av| 在线综合亚洲| 尹人成人综合网| 激情五月色综合国产精品| 蜜桃av.网站在线观看| 国产精品久久久久久妇女| 蜜桃久久久久久久| 亚洲激情黄色| 亚洲激情中文在线| 激情婷婷亚洲| 久久精品国产99久久| 日韩国产一区二区三区| 国产一区二区三区视频在线| 精品视频在线观看网站| 国产精品日本一区二区三区在线| 日本在线视频一区二区| 蜜芽一区二区三区| 久久电影一区| 视频在线观看一区| 蜜桃一区二区三区在线观看 | 四虎精品永久免费| 中文无码日韩欧| 亚洲精品进入| 日本不卡高清| 日韩一区二区三区四区五区| 蜜桃av一区二区| 综合色一区二区| 日韩欧美中文字幕在线视频| 日本va欧美va瓶| 国产午夜一区| 麻豆中文一区二区| 国产美女高潮在线| 成人看片网站| 激情久久久久久久| 深夜视频一区二区| 国产一区日韩一区| 中文一区二区| 亚洲开心激情| 欧美一级网址| 精品亚洲二区| 亚洲成人va| 亚洲欧洲一区| 亚洲欧美专区| 国产免费久久| 动漫av一区| 日韩精品免费一区二区在线观看 | 欧美日中文字幕| av亚洲免费| 亚洲一区二区三区中文字幕在线观看| 日韩精品欧美大片| 欧美国产另类| 国产亚洲一区二区手机在线观看 | 一级欧美视频| 国产乱论精品| 日韩电影免费在线观看| av不卡在线看| 国产精区一区二区| 久久久久欧美精品| 综合精品一区| 久久精品福利| 欧美成人国产| 日韩美女精品| 成人污污视频| 91高清一区| 国产亚洲久久| 久久精品123| 一区二区91| 国产一区二区三区国产精品| 一区二区自拍| 国产精品久久久久毛片大屁完整版| 高清一区二区| 亚洲一区二区毛片| 久久av综合| 亚洲精品2区| 国产精品theporn| 亚洲四虎影院| 日本不卡一区二区三区| 日韩1区2区| 免费在线成人网| 精品少妇一区| 蜜桃视频在线观看一区| 超碰在线99| 日韩在线电影| 香蕉成人av| 欧美欧美黄在线二区| 日韩不卡在线| 欧美日韩一区二区三区在线电影| 色婷婷狠狠五月综合天色拍| 日韩av影院| 国产一区日韩欧美| 国产探花一区在线观看| 99久久99视频只有精品| 国产美女精品视频免费播放软件| 激情婷婷欧美| 精品久久电影| 少妇精品久久久一区二区| 欧美sss在线视频| 国产免费播放一区二区| 亚洲欧美日韩国产综合精品二区| 日韩av在线播放网址| 亚洲ww精品|