alibaba / druid

阿里云计算平台DataWorks(https://help.aliyun.com/document_detail/137663.html) 团队出品,为监控而生的数据库连接池
https://github.com/alibaba/druid/wiki
Apache License 2.0
27.76k stars 8.55k forks source link

多线程使用同一druid连接时抛ArrayIndexOutOfBoundsException异常 #5998

Closed RichardSong-dev closed 1 week ago

RichardSong-dev commented 1 week ago

dbtype:mysql/oceanbase dbversion:5.7/4.3 druid verion:1.2.20 stacktrace info: Caused by: java.lang.ArrayIndexOutOfBoundsException: Index 2 out of bounds for length 2 at java.base/java.util.concurrent.CopyOnWriteArrayList.elementAt(CopyOnWriteArrayList.java:390) at java.base/java.util.concurrent.CopyOnWriteArrayList.get(CopyOnWriteArrayList.java:403) at com.alibaba.druid.filter.FilterChainImpl.nextFilter(FilterChainImpl.java:455) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:530) at com.alibaba.druid.filter.FilterAdapter.connection_prepareStatement(FilterAdapter.java:908) at com.alibaba.druid.filter.FilterChainImpl.connection_prepareStatement(FilterChainImpl.java:531) at com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl.prepareStatement(ConnectionProxyImpl.java:328) at com.alibaba.druid.pool.DruidPooledConnection.prepareStatement(DruidPooledConnection.java:369) error info:在多线程使用由druid创建的同一个数据库连接时,会抛出上述异常。具体的报错原因是程序在调用FilterChainImpl:nextFilter()时因该方法并未进行并发控制且pos++没有使用原子操作,导致并发时pos值超过filtersize大小引起数组越界。

lizongbo commented 1 week ago

多线程使用同一连接的做法就是错误的。