com.atomikos.jdbc.AtomikosSQLException:连接池耗尽 - 尝试增加 'maxPoolSize' 和/或 'borrowConnectionTimeout'

问题描述

在我的 spring 批处理应用程序中,我使用 atomikos 版本(4.0.4)和 JTA(1.1)。一些作业挂在 PROD 中并从 DB 获取所有连接,这反过来又停止了其他作业并行触发。并且都失败了,错误如下。

Error Log 1:
Could not get JDBC Connection; nested exception is com.atomikos.jdbc.AtomikossqlException: Connection pool exhausted - try increasing 'maxPoolSize' and/or 'borrowConnectionTimeout' on the DataSourceBean.

Error Log 2 :
Failed to grow connection pool.

And almost for 13 jobs no instance got created in DB and in control-m the logs were captured with "Null Exception Message intercepted"

有人可以就这个问题提出建议吗?甚至尝试将 atomikos 版本升级到 5.0.0 但仍然出现相同的问题。

 {

AtomikosDataSourceBean ads = new AtomikosDataSourceBean();

        if (mDevModeDriverClassName.toLowerCase().contains("oracle")) {
            if (!mDevModeDriverClassName.equals("oracle.jdbc.xa.client.OracleXADataSource")) {
                log.warn("DataSource property 'devModeDriverClassName' should be set "
                        + "to 'oracle.jdbc.xa.client.OracleXADataSource' when using Oracle! " + "Current value is: "
                        + mDevModeDriverClassName);
            }
        }
        String vUniqueResourceName = "DS-" + UUID.randomUUID();
        log.debug("Creating Oracle XA DataSource. uniqueResourceName={}"+vUniqueResourceName);
        ads.setUniqueResourceName(vUniqueResourceName);
        ads.setXaDataSourceClassName(mDevModeDriverClassName); // "oracle.jdbc.xa.client.OracleXADataSource");
        ads.setMaxPoolSize((mDevModeMaxSize > 0) ? mDevModeMaxSize : 1); //mDevModeMaxSize =10
        ads.setTestQuery("SELECT 1 FROM DUAL");      
        Properties xaProps = new Properties();
        xaProps.setProperty("user",mDevModeUsername);
        xaProps.setProperty("password",mDevModePassword);
        xaProps.setProperty("URL",mDevModeJdbcUrl);
        ads.setXaProperties(xaProps); 
        OracleXADataSource xaDataSource = new OracleXADataSource();
        xaDataSource.setUser(mDevModeUsername);
        xaDataSource.setPassword(mDevModePassword);
        xaDataSource.setURL(mDevModeJdbcUrl);
        ads.setXaDataSource(xaDataSource);

<bean id="rsDataSource" class="com.sample.CustomDataSource" scope="singleton" destroy-method="close">       
        <property name="devModeDriverClassName" value="${spring.datasource.driver-class-name}" />
        <property name="devModeJdbcUrl" value="${spring.datasource.rs.url}" />
        <property name="devModeUsername" value="${spring.datasource.rs.username}" />
        <property name="devModePassword" value="${spring.datasource.rs.password}" />
        <property name="devModeMaxSize" value="10" />  
    </bean> 
 <bean id="transactionManager"
          class="org.springframework.transaction.jta.JtaTransactionManager"  >
        <property name="nestedTransactionAllowed" value="true"/>
        <property name="allowCustomIsolationLevels" value="true"/>
        <property name="defaultTimeout" value="-1"/> 
        <property name="transactionManager"  ref="txManager"></property>
   </bean>
   
   <bean id="txManager" class="com.atomikos.icatch.jta.UserTransactionManager" destroy-method="close">
        <property name="forceShutdown" value="true"/>
        <property name="transactionTimeout" value="60"></property>
        
   </bean> 

解决方法

您要么存在连接泄漏,要么未正确配置池大小。查看您的配置,很可能是您的连接池大小未正确配置:

几乎有 13 个作业没有创建实例

ads.setMaxPoolSize((mDevModeMaxSize > 0) ? mDevModeMaxSize : 1); //mDevModeMaxSize =10

<property name="devModeMaxSize" value="10" />

您的连接池设置为最多提供 10 个连接,但您要启动 13 个作业。所以出现错误应该不足为奇:

Connection pool exhausted - try increasing 'maxPoolSize'

您需要相应地增加 maxPoolSize

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...