java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > shardingsphered 线程安全

shardingsphered 线程安全问题示例分析

作者:雨翔河

这篇文章主要为大家介绍了shardingsphered 线程安全问题示例分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

shardingsphere

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/shardingsphere/issues/1967

以上就是shardingsphered 线程安全问题示例分析的详细内容,更多关于shardingsphered 线程安全的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文