8
我们在做压力测试时候,发现FilterChainImpl中获取metadata元数据时,报数组越界异常,不太懂这里的设计,为什么pos要设置成成员变量,而且还是线程不安全的,每笔请求都会来获取一次元数据,通过元数据获取一下是否支持多结果集。
我们在做压力测试时候,发现FilterChainImpl中获取metadata元数据时,报数组越界异常,不太懂这里的设计,为什么pos要设置成成员变量,而且还是线程不安全的,每笔请求都会来获取一次元数据,通过元数据获取一下是否支持多结果集。
public class FilterChainImpl implements FilterChain {
protected int pos = 0;
private final DataSourceProxy dataSource;
private final int filterSize;
这里看pos不是并发安全的
@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++并不是原子的,会导致并发安全问题
最终导致了数组越界异常
还是说我对这里的理解有问题,但是在压力很高的时候确实会出现数组越界问题,请解答
我觉得这个地方代码不应该这样,虽然这样用责任链很优雅,但是同时带来了并发安全问题