ShardingSphere开启预编译参数insert慢定位
ShardingSphere开启预编译参数insert慢定位问题背景用户反馈在使用 ShardingSphere-JDBC 进行批量插入时性能较慢,插入 500 条数据耗时超过 20 秒。而相同配置下,ShardingSphere-Proxy 执行相同操作则表现正常。
环境信息:
MySQL 驱动版本:8.0.22
MySQL Server 版本:5.7.38
ShardingSphere 版本:5.x
问题现象初步现象相同配置下:
Proxy 执行:正常(约 1-2 秒)
JDBC 执行:很慢(500 条数据超过 20 秒)
通过添加日志确认:慢在 MySQL 驱动执行 SQL 到驱动返回结果这段过程。
疑问点疑问 1:数据源参数配置相同,为什么 Proxy 不慢而 JDBC 慢?
疑问 2:useServerPrepStmts 和 cachePrepStmts 这两个参数对批量插入的影响是什么?
问题定位1. 排查思路123456问题排查流程:1. 确认问题现象:Proxy 快,JDBC 慢2. 添加详细日志:定位具体耗时点(MySQL 驱动执行到返回慢)3. 抓包分析:确 ...
HikariCP 连接池创建流程
HikariCP 连接池创建流程使用123456789101112131415161718192021222324// 创建 HikariCP 连接池 DemoHikariConfig config = new HikariConfig();config.setJdbcUrl("jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC");config.setUsername("root");config.setPassword("root");config.setDriverClassName("com.mysql.cj.jdbc.Driver");// 设置配置属性config.setMinimumIdle(2);config.setMaximumPoolSize(10);config.setConnectionTimeout(30000);config.setIdleTimeout(600000);config.setMa ...
Apache Ignite 开启事务执行流程
Apache Ignite 开启事务执行流程作用总体流程12345678910获取 Ignite 实例获取 Ignite Transaction 对象 加读写锁以确保当前线程只有一个事务开启事务 初始化近程事务 GridNearTxLocal 初始化事务状态,设置事务版本、拓扑信息、映射等 获取版本管理器 获取拓扑版本 生成下一个版本号返回事务代理供用户操作
详细流程获取ignite实例这一步获取 Ignite 集群的入口点实例,用于后续操作。Ignition 类是静态工厂方法,内部通过 IgnitionEx 获取实际的网格实例,并根据安全配置决定是否包装为代理对象。
1234567org.apache.ignite.Ignition#ignite 获取ignite实例 org.apache.ignite.internal.IgnitionEx#grid 获取网格实例 org.apache.ignite.internal.IgnitionEx#grid 获取网格实例 org.apac ...
Apache Ignite 分布式事务原理
Apache Ignite 分布式事务原理Apache Ignite 是一个高性能、集成化和分布式的内存计算平台,支持在大数据量场景下进行 SQL 查询、计算和事务处理。在本文中,我们将深入探讨 Apache Ignite 中分布式事务的实现原理。
使用示例首先,让我们通过一个简单的示例来了解如何在 Ignite 中使用事务:
12345678910111213141516171819202122// 启动 ignitetry (Ignite ignite = Ignition.start("examples/config/example-ignite.xml")) { // 配置 CacheConfiguration<Integer, Account> cfg = new CacheConfiguration<>(CACHE_NAME); cfg.setAtomicityMode(CacheAtomicityMode.TRANSACTIONAL); // 创建缓存 try (IgniteCache&l ...
Apache Ignite IDEA 环境搭建
Apache Ignite IDEA 源码 DEBUG 环境搭建Apache Ignite是一个高性能、集成化和分布式的内存计算平台,本文将介绍如何在 IDEA 中搭建 Ignite 源码调试环境。
Idea 代码编译Ignite 项目构建比较简单。使用 JDK 11,执行如下命令编译即可。
1mvn clean install -DskipITs -DskipTests --settings ~/.m2/settings.xml
参数说明:
-DskipITs:跳过集成测试
-DskipTests:跳过单元测试
--settings ~/.m2/settings.xml:指定 Maven 配置文件路径
启动类Ignite提供了多种启动方式,可以通过以下主要启动类进行调试:
org.apache.ignite.startup.cmdline.CommandLineStartup:命令行启动
运行事务测试要运行 Ignite 的事务测试示例,需要进行以下配置:
修改 ignite-examples/config/example-default.xml 配置文 ...
ShardingSphere JDBC 使用 Druid 连接池 ResultSet 内存泄露分析
Druid ResultSet 内存泄露分析现象在使用 ShardingSphere-JDBC 配置 Druid 连接池,通过 Jmeter 开启预编译缓存进行性能压测时,遇到压测性波动较大问题。
定位流程问题分析压测过程中通过 jstat 观测 GC 情况,存在频繁 GC。通过 async profiler 抓取 cpu 火焰图观察,发现大量 CPU 消耗在 GC 线程上,真正执行业务代码的 CPU 占比较少。
压测过程中通过 jmap 执行堆 Dump,通过 Eclipse MAT 分析堆 Dump。查看支配树,压测使用 50 个线程时,存在 50 个 DruidPooledPreparedStatement 实例,但是 DruidPooledPreparedStatement 深堆大小共 1G。每个 DruidPooledPreparedStatement#resultSetTrace 里持有大量 result set 实例。至此,确定 DruidPooledPreparedStatement#resultSetTrace 内存泄漏。
问题复现使用 druid jdbc demo ...
Jmeter 压测 ShardingSphere
使用 Jmeter 压测 ShardingSphere JDBC & Proxy背景用户存在使用 Jmeter 压测 ShardingSphere JDBC & Proxy 的场景,以下简单介绍。
Jmeter 配置使用官方最新的 5.6.3 Jmeter 包即可。
添加 ShardingSphere 依赖可以直接将 ShardingSphere 相关 Jar 包放置到 jmeter/lib/ext 目录下,或者在 Test Plan 测试计划页面将 ShardingSphere Jar 包添加到 ClassPath 配置即可。
新建 jdbc connection configuration 配置
压测 ShardingSphere JDBC如果需要压测 ShardingSphere JDBC,需要在此处配置 ShardingSphere DataSource 数据源。
需要通过 variable name for created pool 指定连接池名称,此处指定为 ss-jdbc-pool。
然后下面配置 ShardingSphere Dri ...
Maven Shade 插件替换 Calcite Jar 包 class 文件
Maven Shade 插件替换 Calcite Jar 包 class 文件由于项目中直接通过 Copy Calcite Jar 包内部的 Java 文件的方式进行代码修改,在运行 ShardingSphere Proxy 过程中,ShardingSphere 的 Jar 包和第三方 Jar 包都放在 lib 目录下,类加载器加载类时,可能会随机加载到 calcite 原有 Jar 包里的同名类,导致类覆盖修改失效。
此处使用 Maven Shade Plugin 在打包阶段将项目中自定义的同名类,替换掉 Calcite Jar 包里的类,实现定制代码。
Maven Shade 插件功能官网介绍了如下几种使用方式:
将多个 Jar 包合并成一个 all in one Jar 包通过 artifactSet 配置要打包哪些 Jar 为一个 all in one Jar:123456789101112<configuration> <artifactSet> <includes> <include> ...
LinkedIn Coral SQL 翻译实现原理
LinkedIn Coral SQL 翻译实现原理总体流程以 Hive SQL 翻译成 Trino SQL 为例:
1234567Hive SQL -> Calcite RelNode 解析成抽象语法树 AST(比如通过 hive 的 antlr 语法解析) 遍历节点转换为 SqlNode SqlNode 转换为 Calcite RelNode(Coral IR)Calcite RelNode -> Trino SQL RelNode -> SqlNode SqlNode -> TrinoSQL
详细流程
{"content":"","children":[{"content":"1.Hive SQL -> Calcite RelNode","children":[{"content":"创建 HiveToRelConverter","children":[{"content":"1.父类 ToRelConverter 构造& ...
LinkedIn Coral 编译&SQL翻译使用
LinkedIn Coral 编译&SQL翻译使用Coral是一个 SQL 翻译、分析和重写引擎。简单来说,可以将一种数据库的 SQL 方言翻译成另一种数据库的 SQL 方言。
构建1.IDEA 编译代码123git clone https://github.com/linkedin/coral.git# 使用 Java 8./gradlew clean build
2.运行 Coral Service Rest 服务方式1:
1234567cd coral-service # 运行 coral 服务,指定参数: 使用本地元存储运行 Coral 服务../gradlew bootRun --args='--spring.profiles.active=localMetastore' # 后端服务在端口 8080 上运行(默认)# 启动阶段开启 remote debug../gradlew bootRun --debug-jvm --args='--spring.profiles.active=localMetastore'
方 ...