雨翔河
首页
列表
关于
shardingsphered 的线程安全问题
2019-11-12 10:06
shardingsphere版本 3.1.0 ,也是目前的最新的正式版,项目并发量很高很笨重(启动较慢),且使用了按天分表策略,在使用shardingsphere的过程中发现其存在分表策略的线程安全问题,会导致分表策略没有执行,直接查询的没有分表策略的逻辑表。 原因: `io.shardingsphere.core.parsing.antlr.extractor.impl.FromWhereExtractor` 这个实现类有一个如下定义: ``` public final class FromWhereExtractor implements OptionalSQLSegmentExtractor { private final TableNameExtractor tableNameExtractor = new TableNameExtractor(); private PredicateExtractor predicateSegmentExtractor; ... public Optional<FromWhereSegment> extract(final ParserRuleContext ancestorNode, final ParserRuleContext rootNode) { ... predicateSegmentExtractor = new PredicateExtractor(result.getTableAliases()); ... } ... ``` 这个地方 `predicateSegmentExtractor` 是有线程安全问题的。 并发量高的时候,predicateSegmentExtractor 成为竞争资源。 这导致的现象是: 应用启动后分表策略不起效果,且是随机性的,假设有20个应用节点,应用重启之后,其中会有一个或者少量节点会出现分表策略无效,查询不到结果,再针对这个节点进行重启就会恢复正常,随机性极高。 不仅仅是我们遇到这个问题,有别的研发公司也遇到过这种问题: https://github.com/apache/incubator-shardingsphere/issues/1967
类型:工作
标签:shardingsphere,分表分库,java
Copyright © 雨翔河
我与我周旋久
独孤影
开源实验室