Druid VS Antlr4

在x86_64环境下,使用eclipse kepler和jdk 6,对比了ANTLR4与Druid手写SQL解析模块的性能。测试结果显示,Druid在单线程和多线程(50线程)情况下解析SQL的性能优于ANTLR4。虽然两者都能支持多种语法,ANTLR4在语法实现和维护上更胜一筹,且其语法文件独立于代码,提高可读性。然而,Druid在关键字支持上需要使用switch语句穷举。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

DRUID VS ANTLR4

测试方法

环境:x86_64,eclipse kepler,jdk 6
测试对象:antlr v4,druid手写sql parser模块
测试过程:分别采用单线程、多线程并发测试。单线程时,比较antlr、druid各自解析1次同一条sql语句的性能;多线程(50线程)时,比较antlr、druid所有线程完成1次同一条sql解析的性能。

测试结果

类别 单线程(druid比antlr) 多线程(druid比antlr)
简单select 7倍 6倍
复杂select 约200倍 约1600倍
Insert 6倍 11倍
Update 15倍 13倍
Delete 3倍 4倍

总结

1、性能:druid好于antlr。
2、语法支持:两者皆可实现各类语法,但antlr易于druid实现。目前发现druid没有完全实现pg语法,如int ‘123’类型转换。
3、可维护性:antlr好于druid 特别是体现在新增语法时,修改druid的工作量大于antlr。
4、可读性:antlr好于druid antlr采用独立的语法文件管理语法规则,druid语法规则与代码耦合。
5、关键字支持:两者皆支持。druid需要使用switch语句块穷举。


package com.laudandjolynn.test;

import java.text.NumberFormat;
import java.util.concurrent.Callable;
import java.util.concurrent.CompletionService;
import java.util.concurrent.ExecutorCompletionService;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

import org.apac
C:\Users\33512\.jdks\corretto-17.0.12\bin\java.exe -XX:TieredStopAtLevel=1 -Dspring.output.ansi.enabled=always -Dcom.sun.management.jmxremote -Dspring.jmx.enabled=true -Dspring.liveBeansView.mbeanDomain -Dspring.application.admin.enabled=true "-Dmanagement.endpoints.jmx.exposure.include=*" "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\lib\idea_rt.jar=56111:C:\Program Files\JetBrains\IntelliJ IDEA 2023.2.1\bin" -Dfile.encoding=UTF-8 -classpath D:\idea\FileManageSystem\file-system\target\classes;D:\MAVEN\repo\com\alibaba\cloud\spring-cloud-starter-alibaba-seata\2.2.8.RELEASE\spring-cloud-starter-alibaba-seata-2.2.8.RELEASE.jar;D:\MAVEN\repo\org\springframework\boot\spring-boot-starter-aop\2.3.12.RELEASE\spring-boot-starter-aop-2.3.12.RELEASE.jar;D:\MAVEN\repo\org\springframework\spring-aop\5.2.15.RELEASE\spring-aop-5.2.15.RELEASE.jar;D:\MAVEN\repo\org\aspectj\aspectjweaver\1.9.6\aspectjweaver-1.9.6.jar;D:\MAVEN\repo\io\seata\seata-spring-boot-starter\1.5.1\seata-spring-boot-starter-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-spring-autoconfigure-client\1.5.1\seata-spring-autoconfigure-client-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-spring-autoconfigure-core\1.5.1\seata-spring-autoconfigure-core-1.5.1.jar;D:\MAVEN\repo\io\seata\seata-all\1.5.1\seata-all-1.5.1.jar;D:\MAVEN\repo\io\netty\netty-all\4.1.65.Final\netty-all-4.1.65.Final.jar;D:\MAVEN\repo\org\antlr\antlr4\4.8\antlr4-4.8.jar;D:\MAVEN\repo\org\antlr\antlr4-runtime\4.8\antlr4-runtime-4.8.jar;D:\MAVEN\repo\org\antlr\antlr-runtime\3.5.2\antlr-runtime-3.5.2.jar;D:\MAVEN\repo\org\antlr\ST4\4.3\ST4-4.3.jar;D:\MAVEN\repo\org\abego\treelayout\org.abego.treelayout.core\1.0.3\org.abego.treelayout.core-1.0.3.jar;D:\MAVEN\repo\org\glassfish\javax.json\1.0.4\javax.json-1.0.4.jar;D:\MAVEN\repo\com\ibm\icu\icu4j\61.1\icu4j-61.1.jar;D:\MAVEN\repo\com\alibaba\druid\1.2.6\druid-1.2.6.jar;D:\MAVEN\repo\com\typesafe\config\1.2.1\config-1.2.1.jar;D:\MAVEN\repo\commons-lang\commons-lang\2.6\commons-lang-2.6.jar;D:\MAVEN\rep
最新发布
03-30
<think>嗯,用户想排查Spring Boot项目中Seata分布式事务相关的依赖配置问题,特别是版本冲突。首先,我需要回忆一下Seata和Spring Cloud Alibaba的版本对应关系。根据引用[4],用户提到使用的是Spring Cloud Alibaba 2.1.0.RELEASE和Seata 1.4.2,但这两个版本不是官方推荐的。这可能就是问题所在,因为版本不匹配会导致兼容性问题。 接下来,我应该先检查依赖版本是否兼容。用户可能没有按照官方推荐的组合来使用,比如Spring Cloud Alibaba和Seata的对应版本。比如,如果用户用的是Spring Boot 2.3.x,可能需要对应特定版本的Seata。需要提醒用户查阅官方文档,确认版本匹配。 然后,检查依赖引入是否正确。用户可能在pom.xml中同时引入了seata-spring-boot-starter和spring-cloud-starter-alibaba-seata,导致冲突。根据引用[4],他们可能替换了seata-all的版本,但需要注意starter的依赖管理。需要建议排除冲突的依赖,或者统一使用其中一个。 另外,Seata的配置是否正确也很重要。比如registry.conf和file.conf的配置是否正确,特别是注册中心和配置中心的设置。引用[5]提到配置文件可以从GitHub获取,用户需要确认这些配置是否适配当前环境,比如使用Nacos还是其他注册中心。 还有事务分组和TC服务的配置是否一致。根据引用[3],每个服务的事务分组需要与Seata Server的配置匹配,否则无法正确连接。用户需要检查application.properties中的service.vgroup-mapping等参数是否正确。 日志分析也是关键。开启DEBUG日志可以帮助定位问题,比如查看Seata客户端的启动日志,是否有连接失败或者配置错误的提示。同时,检查TC服务的日志,确认是否有客户端成功注册。 最后,建议用户使用Maven的依赖树功能,运行mvn dependency:tree来查看是否有版本冲突,排除不必要的依赖。例如,如果存在多个不同版本的Seata相关jar包,需要排除其中一个。 总之,步骤应该是先确认版本兼容性,检查依赖冲突,核对配置参数,分析日志,最后使用工具排查依赖树。这样逐步排除可能的问题点,解决版本冲突和配置错误。</think>### Spring Boot Seata 分布式事务配置依赖版本冲突排查步骤 #### 一、检查依赖版本兼容性 1. **Spring Cloud Alibaba与Seata版本匹配** 根据引用[4],Spring Cloud Alibaba 2.1.0.RELEASE与Seata 1.4.2可能存在兼容性问题。建议参考官方版本对照表,例如: - Spring Cloud Alibaba 2021.0.1 对应 Seata 1.4.2(推荐组合) - Spring Boot 2.6.x 对应 Spring Cloud Alibaba 2021.0.1 若版本不匹配,需调整依赖声明: ```xml <!-- 示例:正确版本声明 --> <dependency> <groupId>com.alibaba.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> <version>2021.0.1</version> </dependency> ``` 2. **Seata依赖冲突** 检查是否同时引入`seata-spring-boot-starter`和`spring-cloud-starter-alibaba-seata`。根据引用[2],需统一依赖管理: ```xml <!-- 排除冲突依赖 --> <dependency> <groupId>io.seata</groupId> <artifactId>seata-spring-boot-starter</artifactId> <version>1.4.2</version> <exclusions> <exclusion> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-alibaba-seata</artifactId> </exclusion> </exclusions> </dependency> ``` --- #### 二、核对关键配置项 1. **Seata Server与Client配置一致性** - 确保`registry.conf`中注册中心(如Nacos)与Seata Server配置一致[^5] - 检查`application.properties`中事务分组命名: ```properties # 示例配置[^3] spring.cloud.alibaba.seata.tx-service-group=my_test_tx_group ``` 2. **Undo_log表与AT模式** 确认每个数据库已按引用[3]要求创建`undo_log`表,否则分支事务无法回滚。 --- #### 三、依赖树分析 1. **使用Maven命令排查冲突** ```bash mvn dependency:tree -Dincludes=io.seata,com.alibaba.cloud ``` 输出示例: ``` [INFO] com.example:business:jar:1.0.0 └─ com.alibaba.cloud:spring-cloud-starter-alibaba-seata:jar:2021.0.1 └─ io.seata:seata-spring-boot-starter:jar:1.4.2 ``` 2. **常见冲突场景** | 冲突依赖 | 解决方案 | |---------------------------|-----------------------------------| | `seata-all`与`seata-spring-boot-starter` | 统一使用Starter依赖 | | `spring-cloud-alibaba-seata`版本不一致 | 对齐Spring Cloud Alibaba版本 | --- #### 四、日志分析与调试 1. **开启DEBUG日志** 在`application.properties`中添加: ```properties logging.level.io.seata=DEBUG ``` 2. **关键日志检查点** - `Register TM成功`:事务管理器注册成功 - `Register RM成功`:资源管理器注册成功 - `Branch register failed`:分支事务注册失败(通常因配置错误) --- #### 五、配置文件检查 根据引用[5],从Seata GitHub仓库获取标准配置文件: ```conf # registry.conf示例(Nacos注册中心) registry { type = "nacos" nacos { serverAddr = "localhost:8848" namespace = "" cluster = "default" } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值