[alibaba/druid]FilterChainImpl并发安全问题

2025-11-11 240 views
8

我们在做压力测试时候,发现FilterChainImpl中获取metadata元数据时,报数组越界异常,不太懂这里的设计,为什么pos要设置成成员变量,而且还是线程不安全的,每笔请求都会来获取一次元数据,通过元数据获取一下是否支持多结果集。

回答

8

public class FilterChainImpl implements FilterChain {

protected int                 pos = 0;

private final DataSourceProxy dataSource;

private final int             filterSize;

这里看pos不是并发安全的

8

@Override public DatabaseMetaData connection_getMetaData(ConnectionProxy connection) throws SQLException { if (this.pos < filterSize) { return nextFilter() .connection_getMetaData(this, connection); }

    return connection.getRawObject()
            .getMetaData();
}

判断大小和nextFilter中的qos++并不是原子的,会导致并发安全问题

5

最终导致了数组越界异常

7

还是说我对这里的理解有问题,但是在压力很高的时候确实会出现数组越界问题,请解答

4

我觉得这个地方代码不应该这样,虽然这样用责任链很优雅,但是同时带来了并发安全问题