日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Shardingjdbc啟動優(yōu)化,你學會了嗎?

來源: 責編: 時間:2023-11-07 09:12:39 251觀看
導讀一.Sharding-JDBC 啟動優(yōu)化問題分析最近在本地調(diào)試的時候發(fā)現(xiàn),項目本地啟動比較慢,對啟動日志進行分析,Sharding-JDBC 在加載元數(shù)據(jù)的過程中中耗時 116 秒 ,占用了項目啟動時間的一半。[org.apache.shardingsphere.core.l

一.Sharding-JDBC 啟動優(yōu)化

問題分析

最近在本地調(diào)試的時候發(fā)現(xiàn),項目本地啟動比較慢,對啟動日志進行分析,Sharding-JDBC 在加載元數(shù)據(jù)的過程中中耗時 116 秒 ,占用了項目啟動時間的一半。pvn28資訊網(wǎng)——每日最新資訊28at.com

[org.apache.shardingsphere.core.log.ConfigurationLogger:104] : [0||0] Properties:max.connections.size.per.query: '1'[org.apache.shardingsphere.core.metadata.ShardingMetaDataLoader:131] : [0||0] Loading 2 logic tables' meta data.[org.apache.shardingsphere.sql.parser.binder.metadata.schema.SchemaMetaDataLoader:70] : [0||0] Loading 401 tables' meta data.[org.apache.shardingsphere.shardingjdbc.jdbc.core.context.MultipleDataSourcesRuntimeContext:59] : [0||0] Meta data load finished, cost 115930 milliseconds.

分析加載流程,核心部分在 SchemaMetaDataLoader#load。pvn28資訊網(wǎng)——每日最新資訊28at.com

List<List<String>> tableGroups = Lists.partition(tableNames, Math.max(tableNames.size() / maxConnectionCount, 1));Map<String, TableMetaData> tableMetaDataMap = 1 == tableGroups.size()        ? load(dataSource.getConnection(), tableGroups.get(0), databaseType) : asyncLoad(dataSource, maxConnectionCount, tableNames, tableGroups, databaseType);

進入代碼看一下,發(fā)現(xiàn)這里會根據(jù) maxConnectionCount 對數(shù)據(jù)庫的表分組進行不同的加載策略,往上游看一下這個 maxConnectionCount 來源于 Sharding-JDBC 的配置,默認為 1。pvn28資訊網(wǎng)——每日最新資訊28at.com

public enum ConfigurationPropertyKey implements TypedPropertyKey {  //.......  /**   * Max opened connection size for each query.   */  MAX_CONNECTIONS_SIZE_PER_QUERY("max.connections.size.per.query", String.valueOf(1), int.class)  //......}

那是不是把這個配置擴展一下就可以提高啟動速度了?在將配置隨意設置成 8 之后由 116s 提升至 15s。pvn28資訊網(wǎng)——每日最新資訊28at.com

從這里來看啟動問題解決了,同時也產(chǎn)生了疑問,為什么 max.connections.size.per.query 默認值設置為 1。pvn28資訊網(wǎng)——每日最新資訊28at.com

這里是官網(wǎng)對于配置的解釋,物理數(shù)據(jù)庫為每次查詢分配的最大連接數(shù)量。pvn28資訊網(wǎng)——每日最新資訊28at.com

圖片pvn28資訊網(wǎng)——每日最新資訊28at.com

光看字面意思無法評估影響面,那就從 Sharding-JDBC 的查詢?nèi)肟陂_始看一下 ShardingPreparedStatement#executeQuerypvn28資訊網(wǎng)——每日最新資訊28at.com

public ResultSet executeQuery() throws SQLException {  ResultSet result;  try {  clearPrevious();  prepare();  initPreparedStatementExecutor();  MergedResult mergedResult = mergeQuery(preparedStatementExecutor.executeQuery());  result = new ShardingResultSet(preparedStatementExecutor.getResultSets(), mergedResult, this, executionContext);  } finally {  clearBatch();  }  currentResultSet = result;  return result;}

......pvn28資訊網(wǎng)——每日最新資訊28at.com

SQLExecutePrepareTemplate#getSQLExecuteGroupspvn28資訊網(wǎng)——每日最新資訊28at.com

private List<InputGroup<StatementExecuteUnit>> getSQLExecuteGroups(  final String dataSourceName,  final List<SQLUnit> sqlUnits,  final SQLExecutePrepareCallback callback) throws SQLException {  List<InputGroup<StatementExecuteUnit>> result = new LinkedList<>();  int desiredPartitionSize = Math.max(0 == sqlUnits.size() % maxConnectionsSizePerQuery ? sqlUnits.size() / maxConnectionsSizePerQuery : sqlUnits.size() / maxConnectionsSizePerQuery + 1, 1);  List<List<SQLUnit>> sqlUnitPartitions = Lists.partition(sqlUnits, desiredPartitionSize);  ConnectionMode connectionMode = maxConnectionsSizePerQuery < sqlUnits.size() ? ConnectionMode.CONNECTION_STRICTLY : ConnectionMode.MEMORY_STRICTLY;  List<Connection> connections = callback.getConnections(connectionMode, dataSourceName, sqlUnitPartitions.size());  int count = 0;  for (List<SQLUnit> each : sqlUnitPartitions) {      result.add(getSQLExecuteGroup(connectionMode, connections.get(count++), dataSourceName, each, callback));  }  return result;}

這里可以看到,根據(jù) maxConnectionsSizePerQuery 選擇了不同的模式 CONNECTION_STRICTLY 、 MEMORY_STRICTLYpvn28資訊網(wǎng)——每日最新資訊28at.com

這里先說一下 sqlUnits 是什么,在分表之后進行查詢,如果查詢參數(shù)中不帶分片參數(shù)的話,Sharding-JDBC 會將 SQL 進行處理,例:pvn28資訊網(wǎng)——每日最新資訊28at.com

select * from table where field= “測試查詢”;

實際執(zhí)行的過程中會被處理成pvn28資訊網(wǎng)——每日最新資訊28at.com

select * from table0 where field = “測試查詢”; select * from table1 where field = “測試查詢”; select * from table2 where field = “測試查詢”; ...... select * from table(n-1) where field = “測試查詢”;

Sharding-JDBC 會將真實 SQL 查詢的數(shù)據(jù)進行聚合,聚合的方式根據(jù) maxConnectionsSizePerQuery 配置有兩種,即 CONNECTION_STRICTLY、MEMORY_STRICTLY。pvn28資訊網(wǎng)——每日最新資訊28at.com

CONNECTION_STRICTLY 可以理解為對同一數(shù)據(jù)源最多創(chuàng)建 maxConnectionsSizePerQuery 個連接。pvn28資訊網(wǎng)——每日最新資訊28at.com

MEMORY_STRICTLY 則是對一次操作的數(shù)據(jù)庫連接不做限制,同一數(shù)據(jù)源 n 張分表就創(chuàng)建 n 個連接,多線程并發(fā)處理。pvn28資訊網(wǎng)——每日最新資訊28at.com

從理論上看,是不是可以將 max.connections.size.per.query 設置的大一點,只要單次操作創(chuàng)建的數(shù)據(jù)源不超過數(shù)據(jù)庫連接上限就可以了?其實不一定,這里進入 UPDATE 的方法看一下。pvn28資訊網(wǎng)——每日最新資訊28at.com

public int executeUpdate() throws SQLException {  try {  clearPrevious();  prepare();  initPreparedStatementExecutor();  return preparedStatementExecutor.executeUpdate();  } finally {  clearBatch();  }}

發(fā)現(xiàn)這里在執(zhí)行 SQL 前同 SELECT 執(zhí)行了一樣的預處理邏輯 initPreparedStatementExecutor() ,那么在 max.connections.size.per.query > 1 的情況下,無論是那種模式都可能會根據(jù)配置的不同獲取多個數(shù)據(jù)源,執(zhí)行 UPDATE 就有可能存在死鎖問題。pvn28資訊網(wǎng)——每日最新資訊28at.com

例:pvn28資訊網(wǎng)——每日最新資訊28at.com

@Transactionalpublic void test(){  updateByID(1);  updateByKey(1);}

圖片圖片pvn28資訊網(wǎng)——每日最新資訊28at.com

所以最終得出結論目前狀態(tài)下,測試環(huán)境、預發(fā)環(huán)境可對max.connections.size.per.query 進行配置,提高啟動速度,在線上環(huán)境 max.connections.size.per.query 默認為 1 保證應用的穩(wěn)定。pvn28資訊網(wǎng)——每日最新資訊28at.com

總結

在分析啟動問題的過程中對 Sharding-JDBC 查詢過程進行了簡單的了解,規(guī)避了線上可能引發(fā)的問題,同時也提醒了自己在改動一些配置時需要對配置所涉及的影響面進行充分評估后再進行改動。pvn28資訊網(wǎng)——每日最新資訊28at.com

參考資料

  • Sharding-JDBC 官方文檔 https://shardingsphere.apache.org/document/current/cn/overview/

本文鏈接:http://www.www897cc.com/showinfo-26-17373-0.htmlShardingjdbc啟動優(yōu)化,你學會了嗎?

聲明:本網(wǎng)頁內(nèi)容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 開發(fā)微服務的九個最佳實踐

下一篇: Golang 中的 Bytes 包詳解之Bytes.Buffer

標簽:
  • 熱門焦點
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 中國家電海外掘金正當時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場戰(zhàn)況空前,中國創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 大廠卷向扁平化

    來源:新熵作者丨南枝 編輯丨月見大廠職級不香了。俗話說,兵無常勢,水無常形,互聯(lián)網(wǎng)企業(yè)調(diào)整職級體系并不稀奇。7月13日,淘寶天貓集團啟動了近年來最大的人力制度改革,目前已形成一
  • 當家的盒馬,加速謀生

    來源 | 價值星球Planet作者 | 歸去來自己&ldquo;當家&rdquo;的盒馬,開始加速謀生了。據(jù)盒馬官微消息,盒馬計劃今年開放生鮮供應鏈,將其生鮮商品送往食堂。目前,盒馬在上海已經(jīng)與
  • 小米MIX Fold 3配置細節(jié)曝光:搭載領先版驍龍8 Gen2+罕見5倍長焦

    這段時間以來,包括三星、一加、榮耀等等有不少品牌旗下的最新折疊屏旗艦都得到了不少爆料,而小米新一代折疊屏旗艦——小米MIX Fold 3此前也屢屢被傳
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發(fā)布會,除了首發(fā)安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發(fā)布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • iQOO Neo8 Pro搶先上架:首發(fā)天璣9200+ 安卓性能之王

    經(jīng)過了一段時間的密集爆料,昨日iQOO官方如期對外宣布:將于5月23日推出全新的iQOO Neo8系列新品,官方稱這是一款擁有旗艦級性能調(diào)校的作品。隨著發(fā)布時
  • 電博會與軟博會實現(xiàn)"線下+云端"的雙線融合

    在本次“電博會”與“軟博會”雙展會利好條件的加持下,既可以發(fā)揮展會拉動人流、信息流、資金流實現(xiàn)快速交互流動的作用,繼而推動區(qū)域經(jīng)濟良性發(fā)展;又可以聚
Top 主站蜘蛛池模板: 旅游| 太康县| 明光市| 六盘水市| 巴东县| 许昌市| 谢通门县| 浪卡子县| 沁水县| 泸州市| 高平市| 龙泉市| 长阳| 宝清县| 东乌| 东宁县| 韶山市| 凯里市| 定州市| 长海县| 威海市| 远安县| 潮州市| 马尔康县| 怀来县| 额济纳旗| 金山区| 东乡族自治县| 平远县| 乐陵市| 安新县| 衡山县| 清水河县| 当雄县| 闽侯县| 台南市| 巫溪县| 铁岭市| 普宁市| 麻江县| 辽中县|