当前位置: 首页 > 知识库问答 >
问题:

使用JdbcTemplate在Spring Boot时连接池耗尽

严高峻
2023-03-14
    null
    null
    com.atomikos.jdbc.AtomikosSQLException: Connection pool exhausted - try increasing 'maxPoolSize' and/or 'borrowConnectionTimeout' on the DataSourceBean.

额外信息:没有其他异常抛出,我知道。所有其他数据都被正确地检索。派人帮忙。

更新:我做了一些更多的实验:这个应用程序使用了另一个dao,我之前没有提到,因为我忘了。它的工作方式几乎相同,只是连接到一个不同的数据库,所以它有一个单独的配置。它还利用了JdbcNamedTemplate和@Qualifier来选择正确的模板。

现在,我发现,使一个或另一个DAO失效将不再吃连接。所以问题是:他们有什么不能和平共处的?

    @Component
    public class WindowsDao {

        private static final String PARAM_1 = "param";

        private final String SELECT_ALL = ""
                + " SELECT "
                + "   STUFF "
                + " FROM TABLE " 
                + " WHERE "
                + "     THING =:" + PARAM_1
                + " WITH UR";

        @Autowired
        private NamedParameterJdbcTemplate myTemplate;

        public Optional<List<BottomDealerText>> getWindows(
                final WindowsCode windowCode {

            final MapSqlParameterSource queryParameters = new MapSqlParameterSource()
                    .addValue(PARAM_1, windowCode.getValue())

            final Optional<List<Window>> windows;
            try {
                windows = Optional.of(myTemplate.query(
                        SELECT_ALL,
                        queryParameters,
                        new WindowsRowMapper()));
            }
            catch (final EmptyResultDataAccessException e) {
                LOG.warn("No results were found.");
                return Optional.empty();
            }
            return windows;
        }
    }
    @Service
    @Transactional
    public class WindowsService {

        @Autowired
        private WindowsDao windowsDao;

        public Optional<List<Stuff>> getWindows(
                final WindowCode windowCode) {
            final Optional<List<Window>> windows = windowsDao.getWindows(
                    windowCode;
            return windows;
        }
    }
    @Service
    @Transactional
    public class AssembleHouseService { 
        // some things
        @Autowired
        private WindowsService windowsService;

        public House buildHouse(final SomeParams params) {
            // This service will fetch parts of the house
            HouseBuilder builder = House.builder();
            // call other services and then...
            builder.windows(windowsService.getWindows(args).orElse(/*something*/));
            //and then some more things...
        }
    }

这是我用来配置数据源的:

    myDb:
    driver: db2
    schema: STUFF
    unique-resource-name: STUFF
    database-name: STUFF1
    server-name: myServer
    port: 12312
    username: hello
    password: world
    driver-type: 4
    min-pool-size: 2
    max-pool-size: 50

RowMapper:

public class WindowsRowMapper implements RowMapper<Window> {

    @Override
    public Windows mapRow(final ResultSet rs, final int rowNum)
            throws SQLException {
        return new BottomDealerText(
                re.getString("WSIZE"),
                rs.getString("DESCRIPTION"),
                rs.getString("COLOR"));
    }
}

共有1个答案

壤驷俊逸
2023-03-14

如果在同一个事务中有两个只读DAO,那么您可能在Atomikos开源版中遇到了一个已知的bug,该bug只在这个特定的场景中出现。

它已经在商业版中修复,但还没有在开源版中修复。

希望能有所帮助

 类似资料:
  • 我正在开发一个需要在大型机上调用DB2函数以获取id的应用程序。 在spring应用程序上下文中,我定义了jdbc模板来查询zOS上的DB2: 然后,我将数据源定义如下: 以上工作。然而,看看ibm的db2jcc内部。jar文件中,我看到了一个用于连接池的datasource类-com。ibm。db2.jcc。DB2ConnectionPoolDataSource。所以我试着用它来代替上面的一个,

  • 我在项目中使用ApacheTomcat JDBC连接池。我很困惑,因为在重负下,我一直看到以下错误: 我的期望是,使用池,新连接的请求将被保留在队列中,直到连接可用。相反,当池达到容量时,请求似乎会被拒绝。这种行为可以改变吗? 谢谢, 达尔 这是我的池配置:

  • 我有使用hikari池创建连接池的Spring启动应用程序。我们正在使用postgres sql用于db。当我以低qps命中系统时,请求需要大约200毫秒来执行。当部署一个pod并且qps为15时,事情保持良好状态。但是一旦我将qps增加到20,请求就开始需要大约10秒来处理,连接池变空(java.sql.SQLTransientConntion异常:菲尼克斯-连接不可用,请求在30183毫秒后超

  • 我正在EclipseJuno中开发一个JavaEEWeb应用程序。我已经将Tomcat配置为使用JDBC连接池(org.apache.Tomcat.JDBC.pool)和PostgreSQL数据库。以下是我的项目META-INF/context中的配置。xml: 我的应用程序使用Eclipse部署到Tomcat,在Tomcat的context.xml属性reloadable设置为"true",以便

  • 我有一个Spring启动,Hibernate使用java应用程序。我部署它在一个jetty webserver与多个实例.如果我有太多(大于10)很多实例我得到 许多连接(10x实例)显示为空闲 ps: 实例的Hikari跟踪日志: 设置 没有记录任何有趣的事情。我认为这看起来很有趣-连接不可用 有什么办法可以调试这个吗?我也在java 7上,所以hikari 2.4.7

  • 问题内容: 我在GlassFish上有一个Java-JSF Web应用程序,我想在其中使用连接池。因此,我创建了一个有范围的Bean,可与其他Bean的实例一起使用: 这样,连接池很快就会被填满。在“ db-related”视图中进行几次导航后,应用程序将停止以下操作: RAR5117:无法从连接池[mysql_testPool]获取/创建连接。原因:使用中的连接等于最大池大小和已过期的最大等待时