具有threadPool
设置,其中有8个线程与数据库交互,进行选择和插入。通过扩展BasicDataSource并将maxactive设置为30,将maxIdle设置为相同,来设置数据源。
我的应用程序运行良好,但是当我查看jvisualVM时,我看到很多等待数据库连接的消息,这使我感到困惑,因为我最多有8个线程使用共享JdbcTemplate
数据库:Oracle 12cr2
我该如何解决?
尝试将MaxIdle
设置为与MaxActive相同的数字,并且没有任何区别,我仍然看到延迟。
我认为可能由于jdbctemplate的一些错误配置而可能共享一个连接,因此在其中一个线程获取连接并观察其他线程是否处于饥饿状态之后,我设置了一次断点,但这不是在这种情况下,操作仍在继续,但有延迟,如前所述。
dbcp2配置:
data = property.getProperty(Constants.DATABASE_INITIAL_SIZE);
if( data != null && data.isEmpty() == false )
setInitialSize(Integer.parseInt(data));
else
setInitialSize(10);
data = property.getProperty(Constants.DATABASE_MAX_ACTIVE);
if( data != null && data.isEmpty() == false )
setMaxTotal(Integer.parseInt(data));
else
setMaxTotal(20);
setMaxIdle(20);
java.lang.Thread.State: WAITING (parking)
at sun.misc.Unsafe.park(Native Method)
- parking to wait for <0x0000000540289128> (a java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject)
at java.util.concurrent.locks.LockSupport.park(Unknown Source)
at java.util.concurrent.locks.AbstractQueuedSynchronizer$ConditionObject.await(Unknown Source)
at org.apache.commons.pool2.impl.LinkedBlockingDeque.takeFirst(LinkedBlockingDeque.java:590)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:441)
at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:362)
at org.apache.commons.dbcp2.PoolingDataSource.getConnection(PoolingDataSource.java:134)
我在线程转储中看到了很多。