当前位置:首页 > 科技  > 软件

Shardingjdbc启动优化,你学会了吗?

来源: 责编: 时间:2023-11-07 09:12:39 183观看
导读一.Sharding-JDBC 启动优化问题分析最近在本地调试的时候发现,项目本地启动比较慢,对启动日志进行分析,Sharding-JDBC 在加载元数据的过程中中耗时 116 秒 ,占用了项目启动时间的一半。[org.apache.shardingsphere.core.l

一.Sharding-JDBC 启动优化

问题分析

最近在本地调试的时候发现,项目本地启动比较慢,对启动日志进行分析,Sharding-JDBC 在加载元数据的过程中中耗时 116 秒 ,占用了项目启动时间的一半。v2228资讯网——每日最新资讯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。v2228资讯网——每日最新资讯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);

进入代码看一下,发现这里会根据 maxConnectionCount 对数据库的表分组进行不同的加载策略,往上游看一下这个 maxConnectionCount 来源于 Sharding-JDBC 的配置,默认为 1。v2228资讯网——每日最新资讯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。v2228资讯网——每日最新资讯28at.com

从这里来看启动问题解决了,同时也产生了疑问,为什么 max.connections.size.per.query 默认值设置为 1。v2228资讯网——每日最新资讯28at.com

这里是官网对于配置的解释,物理数据库为每次查询分配的最大连接数量。v2228资讯网——每日最新资讯28at.com

图片v2228资讯网——每日最新资讯28at.com

光看字面意思无法评估影响面,那就从 Sharding-JDBC 的查询入口开始看一下 ShardingPreparedStatement#executeQueryv2228资讯网——每日最新资讯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;}

......v2228资讯网——每日最新资讯28at.com

SQLExecutePrepareTemplate#getSQLExecuteGroupsv2228资讯网——每日最新资讯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;}

这里可以看到,根据 maxConnectionsSizePerQuery 选择了不同的模式 CONNECTION_STRICTLY 、 MEMORY_STRICTLYv2228资讯网——每日最新资讯28at.com

这里先说一下 sqlUnits 是什么,在分表之后进行查询,如果查询参数中不带分片参数的话,Sharding-JDBC 会将 SQL 进行处理,例:v2228资讯网——每日最新资讯28at.com

select * from table where field= “测试查询”;

实际执行的过程中会被处理成v2228资讯网——每日最新资讯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 查询的数据进行聚合,聚合的方式根据 maxConnectionsSizePerQuery 配置有两种,即 CONNECTION_STRICTLY、MEMORY_STRICTLY。v2228资讯网——每日最新资讯28at.com

CONNECTION_STRICTLY 可以理解为对同一数据源最多创建 maxConnectionsSizePerQuery 个连接。v2228资讯网——每日最新资讯28at.com

MEMORY_STRICTLY 则是对一次操作的数据库连接不做限制,同一数据源 n 张分表就创建 n 个连接,多线程并发处理。v2228资讯网——每日最新资讯28at.com

从理论上看,是不是可以将 max.connections.size.per.query 设置的大一点,只要单次操作创建的数据源不超过数据库连接上限就可以了?其实不一定,这里进入 UPDATE 的方法看一下。v2228资讯网——每日最新资讯28at.com

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

发现这里在执行 SQL 前同 SELECT 执行了一样的预处理逻辑 initPreparedStatementExecutor() ,那么在 max.connections.size.per.query > 1 的情况下,无论是那种模式都可能会根据配置的不同获取多个数据源,执行 UPDATE 就有可能存在死锁问题。v2228资讯网——每日最新资讯28at.com

例:v2228资讯网——每日最新资讯28at.com

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

图片图片v2228资讯网——每日最新资讯28at.com

所以最终得出结论目前状态下,测试环境、预发环境可对max.connections.size.per.query 进行配置,提高启动速度,在线上环境 max.connections.size.per.query 默认为 1 保证应用的稳定。v2228资讯网——每日最新资讯28at.com

总结

在分析启动问题的过程中对 Sharding-JDBC 查询过程进行了简单的了解,规避了线上可能引发的问题,同时也提醒了自己在改动一些配置时需要对配置所涉及的影响面进行充分评估后再进行改动。v2228资讯网——每日最新资讯28at.com

参考资料

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

本文链接:http://www.28at.com/showinfo-26-17373-0.htmlShardingjdbc启动优化,你学会了吗?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 开发微服务的九个最佳实践

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

标签:
  • 热门焦点
  • Redmi Pad评测:红米充满野心的一次尝试

    Redmi Pad评测:红米充满野心的一次尝试

    从Note系列到K系列,从蓝牙耳机到笔记本电脑,红米不知不觉之间也已经形成了自己颇有竞争力的产品体系,在中端和次旗舰市场上甚至要比小米新机的表现来得更好,正所谓“大丈夫生居
  • 分布式系统中的CAP理论,面试必问,你理解了嘛?

    分布式系统中的CAP理论,面试必问,你理解了嘛?

    对于刚刚接触分布式系统的小伙伴们来说,一提起分布式系统,就感觉高大上,深不可测。而且看了很多书和视频还是一脸懵逼。这篇文章主要使用大白话的方式,带你理解一下分布式系统
  • 学习JavaScript的10个理由...

    学习JavaScript的10个理由...

    作者 | Simplilearn编译 | 王瑞平当你决心学习一门语言的时候,很难选择到底应该学习哪一门,常用的语言有Python、Java、JavaScript、C/CPP、PHP、Swift、C#、Ruby、Objective-
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 一篇文章带你了解 CSS 属性选择器

    一篇文章带你了解 CSS 属性选择器

    属性选择器对带有指定属性的 HTML 元素设置样式。可以为拥有指定属性的 HTML 元素设置样式,而不仅限于 class 和 id 属性。一、了解属性选择器CSS属性选择器提供了一种简单而
  • 拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    拼多多APP上线本地生活入口,群雄逐鹿万亿市场

    Tech星球(微信ID:tech618)文 | 陈桥辉 Tech星球独家获悉,拼多多在其APP内上线了&ldquo;本地生活&rdquo;入口,位置较深,位于首页的&ldquo;充值中心&rdquo;内,目前主要售卖美食相关的
  • 到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    到手价3099元起!iQOO Neo8 Pro今日首销:安卓性能最强旗舰

    5月23日,iQOO如期举行了新品发布会,全新的iQOO Neo8系列也正式与大家见面,包含iQOO Neo8和iQOO Neo8 Pro两个版本,其中标准版搭载高通骁龙8+,而Pro版更
  • 英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    英特尔Xe-HP项目终止,将专注Xe-HPC/HPG系列显卡

    据10 月 31 日消息报道,英特尔高级副总裁兼加速计算系统和图形事业部总经理 表示,Xe-HP“ Arctic Sound” 系列服务器 GPU 已经应用于 oneAPI devcloud 云服
  • 华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    华为举行春季智慧办公新品发布会 首次推出电子墨水屏平板

    北京时间2月27日晚,华为在巴塞罗那举行春季智慧办公新品发布会,在海外市场推出之前已经在中国市场上市的笔记本、平板、激光打印机等办公产品,并首次推出搭载
Top