问题描述:获取数据库连接时,数组下标越界
[ERROR] [pool-88-thread-3] [o.l.p.ConnectionPool:getConnection:240] Problem getting connection
java.lang.IndexOutOfBoundsException: Index: 51, Size: 50
at java.util.ArrayList.rangeCheck(ArrayList.java:635) ~[?:1.7.0_80]
at java.util.ArrayList.get(ArrayList.java:411) ~[?:1.7.0_80]
at org.logicalcobwebs.proxool.util.FastArrayList.get(FastArrayList.java:475) ~[proxool-0.9.0RC3.jar:?]
at org.logicalcobwebs.proxool.ConnectionPool.getConnection(ConnectionPool.java:190) [proxool-0.9.0RC3.jar:?]
at org.logicalcobwebs.proxool.ProxoolDataSource.getConnection(ProxoolDataSource.java:97) [proxool-0.9.0RC3.jar:?]
at org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider.getConnection(LocalDataSourceConnectionProvider.java:85) [spring-orm-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:74) [hibernate-core-3.6.9.Final.jar:3.6.9.Final]
at com.sun.proxy.$Proxy86.setReadOnly(Unknown Source) [?:?]
at org.springframework.jdbc.datasource.DataSourceUtils.prepareConnectionForTransaction(DataSourceUtils.java:155) [spring-jdbc-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.orm.hibernate3.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:513) [spring-orm-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) [spring-tx-4.1.2.RELEASE.jar:4.1.2.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:439) [spring-tx-4.1.2.RELEASE.jar:4.1.2.RELEASE]
原因:org.logicalcobwebs.proxool.ConnectionPool类中有一个全局变量标明下一个连接在数组里的下标,如果在回收连接的同时去获取连接的话就会出现这个问题。
目前的解决方案:
在org.logicalcobwebs.proxool.ConnectionPool类中的方法getConnection和expireConnection方法加同步,如果不想考虑性能,就直接加方法上吧,如果要考虑,就自己去读读源码,可以细化到for循环里。
建议不要再使用Proxool
http://bbs.csdn.net/topics/360106398
http://blog.csdn.net/lovesqcc/article/details/12023403
Proxool作者证实这个bug : https://sourceforge.net/p/proxool/mailman/message/23383678/
其他数据库连接池:http://blog.csdn.net/qq_31125793/article/details/51241943