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...
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...
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...
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> ...
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' ...
H2 Database 事务隔离性实现原理
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 语句执行流程
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 流程实现原理
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...