avatar
文章
81
标签
35
分类
28
主页
归档
标签
分类
关于我
flyingzc's blog
主页
归档
标签
分类
关于我

flyingzc's blog

ShardingSphere JDBC 使用 Druid 连接池 ResultSet 内存泄露分析
发表于2025-07-01|Druid
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...
Jmeter 压测 ShardingSphere
发表于2025-07-01|Jmeter
使用 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...
Maven Shade 插件替换 Calcite Jar 包 class 文件
发表于2025-07-01|Maven
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> ...
LinkedIn Coral SQL 翻译实现原理
发表于2025-04-09|Coral
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翻译使用
发表于2025-03-07|Coral
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' ...
H2 Database 事务隔离性实现原理
发表于2024-11-12|H2
H2 Database 事务隔离性实现原理使用测试 cases: 12345678910111213隔离级别 RC A 开启事务 B 开启事务 B 插入数据并提交 A 可以读取到隔离级别 RR A 开启事务 B 开启事务 A 查询 B 插入数据并提交 A 读取不到 A 自己插入数据 A 可以读取到自己插入的数据 功能H2 支持的事务隔离级别,定义在 IsolationLevel 里。包括 READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SNAPSHOT, SERIALIZABLE。其中 REPEATABLE_READ 不允许出现 脏读 和 不可重复读,但是允许出现幻读。SNAPSHOT 不允许出现 脏读 和 不可重复读 和 幻读。 12345678910111213141516171819202122232425262728293031323334/** * Level of isolation. */public enum IsolationLevel...
H2 Database Select 语句执行流程
发表于2024-10-24|H2
H2 Database Select 语句执行流程使用1234// CREATE TABLE IF NOT EXISTS test(id INT primary key, name VARCHAR(255))// insert into test(id, name) values(1, 'name1'), (2, 'name2'), (3, 'name3'), (4, 'name4');String sql = "SELECT * FROM test where id > 1 and name='name3'";ResultSet rs = stmt.executeQuery(sql); 查询 case: 1234主键查询覆盖索引查询索引查询+回表多表关联查询 功能模块类总体流程12345678910111213Select 语句 SQL 解析Select 语句 SQL 查询优化 计算执行计划的成本 创建查询优化器 优化查询计划 ...
H2 Database 事务 Rollback 流程实现原理
发表于2024-10-16|H2
H2 Database 事务 Rollback 流程实现原理使用1234567Connection conn = getConnection();// 开启事务conn.setAutoCommit(false);// 执行 SQLexecuteWithLog(conn, "insert into Test(id, name) values(1, 'name1'), (2, 'name2')");// 回滚事务conn.rollback(); 功能模块类总体流程当执行事务回滚时,会获取当前事务所有的 undoLogId,然后从后向前遍历每一个 undoLogId。对于每一个 undoLogId,先遍历 undoLog btree 找到存储的 Record。Record 信息里包含了当前 undoLogId 操作的数据行信息。然后根据 Record 信息找到对应记录的 primary key btree,根据主键 id 找到对应行记录进行回滚操作。当记录回滚完之后,再回滚 undoLog btree 上的 undoLog...
H2 Database MVStore Commit 流程
发表于2024-10-15|H2
H2 Database MVStore Commit 流程作用BackgroundWriterThread 按照固定频率,将内存里修改的尚未保存的 Page 信息持久化到存储。 流程启动阶段创建后台线程org.h2.mvstore.MVStore#setAutoCommitDelay1.创建 BackgroundWriterThread 后台线程2.创建序列化线程 serializationExecutor3.创建持久化线程 bufferSaveExecutor设置自动提交更改的最大延迟(单位毫秒)。 默认值为 1000,这意味着所有更改最多在一秒后提交。 要禁用自动提交,需要将值设置为 0。在这种情况下,仅在显式调用 commit 时才会提交更改。 BackgroundWriterThread 线程逻辑定时任务周期性执行,比对内存里的 MVMap...
H2 Database MvMap 插入数据流程
发表于2024-10-12|H2
H2 Database MvMap 插入数据流程H2Database 使用 MVStore 作为默认的存储子系统,支持多版本,持久化的键值存储。其中每一个 MVMap 对象代表了一颗 btree。MVMap 里包含了 btree 根页面的引用,这颗 btree 可以表示一张表、一个索引,或者用来记录 undo log 等。 使用12345678// 1.根据数据库文件名称打开 mvStoreMVStore s = MVStore.open(fileName);// 2.指定名称创建 mvMapMVMap<Integer, String> map = s.openMap("data");// 3.将数据插入到 mvMap 上for (int i = 0; i < 400; i++) { map.put(i, "Hello-" + i);} 相关类MVMap 类成员变量包含了 MVMap 这个 btree 的唯一 id,btree 的根节点引用。btree 每个节点上存储的 key、value...
12…9
avatar
flyingzc
不积跬步无以至千里
不积小流无以成江海
文章
81
标签
35
分类
28
Follow Me
公告
FlyingZC's Blog
最新文章
ShardingSphere JDBC 使用 Druid 连接池 ResultSet 内存泄露分析2025-07-01
Jmeter 压测 ShardingSphere2025-07-01
Maven Shade 插件替换 Calcite Jar 包 class 文件2025-07-01
LinkedIn Coral SQL 翻译实现原理2025-04-09
LinkedIn Coral 编译&SQL翻译使用2025-03-07
分类
  • ADB1
  • AI1
  • Concurrent2
  • Coral2
  • Data Structure1
  • Docker1
  • Druid1
  • Dubbo7
标签
Jmeter Hotspot Spring Maven Data Structure Druid ShardingSphere springboot SQL-Parse H2 Dubbo Omid Android Termux Narayana Tomcat Transaction Otter spring SpringBoot Percolator git Zookeeper Ubuntu Desktop Linux Coral Tool Database ADB Paddle MySQL Redis Docker Concurrent Ubuntu
归档
  • 七月 2025 3
  • 四月 2025 1
  • 三月 2025 1
  • 十一月 2024 1
  • 十月 2024 4
  • 九月 2024 2
  • 八月 2024 2
  • 七月 2024 5
网站信息
文章数目 :
81
本站访客数 :
本站总浏览量 :
最后更新时间 :
©2020 - 2025 By flyingzc