AtomikosSQLException:连接池已耗尽 - 每当应用程序抛出异常时,连接就会耗尽

Posted

技术标签:

【中文标题】AtomikosSQLException:连接池已耗尽 - 每当应用程序抛出异常时,连接就会耗尽【英文标题】:AtomikosSQLException: Connection pool exhausted - Connection getting exhausted whenever application throws exception 【发布时间】:2017-03-25 08:35:28 【问题描述】:

在我的 spring mvc 应用程序中,我使用 Atomikos Transaction API (v3.9.3) 和 JPA(Hibernate 作为供应商)。我有两个实体管理器连接到两个数据源。下面提供了其中一个数据源的配置。 我面临一个问题,即每当我的应用程序抛出异常时,连接就会耗尽并且没有被获取。当池中的所有连接都用尽时,我最终得到 AtomikosSQLException:连接池用尽。谁能帮助我的配置中缺少的内容? 在实现这一点时,我关注了这个博客:

http://fabiomaffioletti.me/blog/2014/04/15/distributed-transactions-multiple-databases-spring-boot-spring-data-jpa-atomikos/

这是我的数据源配置:

@Bean(name = "masterDataSource", initMethod = "init", destroyMethod = "close")
public DataSource masterDataSource() 
    final mysqlXADataSource mysqlXaDataSource = new MysqlXADataSource();
    mysqlXaDataSource.setUrl(Preconditions.checkNotNull(env.getProperty("dataSource.master.url")));
    mysqlXaDataSource.setPinGlobalTxToPhysicalConnection(true);
    mysqlXaDataSource.setUser(Preconditions.checkNotNull(env.getProperty("dataSource.username")));
    mysqlXaDataSource.setPassword(Preconditions.checkNotNull(env.getProperty("dataSource.password")));

    AtomikosDataSourceBean xaDataSource = new AtomikosDataSourceBean();
    xaDataSource.setXaDataSource(mysqlXaDataSource);
    xaDataSource.setUniqueResourceName("ds_master");

    return xaDataSource;

这是堆栈跟踪:

Unable to acquire JDBC Connection [n/a] 2016-11-11 10:50:58,487com.atomikos.jdbc.AtomikosSQLException: Connection pool exhausted - try increasing 'maxPoolSize' and/or 'borrowConnectionTimeout' on the DataSourceBean.
at com.atomikos.jdbc.AtomikosSQLException.throwAtomikosSQLException(AtomikosSQLException.java:46)
at com.atomikos.jdbc.AbstractDataSourceBean.throwAtomikosSQLException(AbstractDataSourceBean.java:90)
at com.atomikos.jdbc.AbstractDataSourceBean.throwAtomikosSQLException(AbstractDataSourceBean.java:85)
at com.atomikos.jdbc.AbstractDataSourceBean.getConnection(AbstractDataSourceBean.java:347)
at com.atomikos.jdbc.AbstractDataSourceBean.getConnection(AbstractDataSourceBean.java:394)
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122)
at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99)
at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.connection(StatementPreparerImpl.java:47)
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:146)

【问题讨论】:

Varenya,您能找到解决此问题的解决方案吗?我想我也有同样的问题。我正在使用 atomikos 4.0.4、Spring 4.3.2 和休眠 4.3.11。 Varenya 和 kenn3th 你解决了吗? 【参考方案1】:

我遇到了同样的问题,它看起来是 Atomikos 上的一个问题,我通过将 atomikos 版本升级到 4.0.6 来解决,如果你是商业用户,你可以尝试3.9.4

【讨论】:

以上是关于AtomikosSQLException:连接池已耗尽 - 每当应用程序抛出异常时,连接就会耗尽的主要内容,如果未能解决你的问题,请参考以下文章

连接池已满,超过最大连接数 解决方案

Java/Hibernate - 异常:内部连接池已达到其最大大小,当前没有可用的连接

MySQL 调用 connection.end() => 后无法打开连接 => 错误:池已关闭

IIS应用程序池相关问题及连接池已满的解决方法

测试时池已关闭(HikariDataSource)

带有 MySQL 错误的 TypeORM:池已关闭。调用数据库时测试卡住