Spring 的 JdbcTemplate 是不是在查询超时后关闭连接?

Posted

技术标签:

【中文标题】Spring 的 JdbcTemplate 是不是在查询超时后关闭连接?【英文标题】:Does Spring's JdbcTemplate close the connection after query timeout?Spring 的 JdbcTemplate 是否在查询超时后关闭连接? 【发布时间】:2013-12-23 13:28:31 【问题描述】:

我在插入语句的方法中设置了查询超时 (getJdbcTemplate().setQueryTimeout(5))。查询超时后会发生什么,jdbc模板会关闭我的连接吗?

【问题讨论】:

可能是的。 JdbcTemplate 负责获取和关闭连接。 【参考方案1】:

简而言之,它确实关闭了连接。长答案取决于。

当您没有 Spring 托管事务时,是的,JdbcTemplate 将调用 Connection 上的 close() 方法。但是,如果由于 Springs 事务管理关闭而已经有可用的连接,则连接将由 Springs 事务支持处理,而后者也将在 Connection 上调用 close()

唯一的区别是连接关闭但close()会被调用。

连接是否实际关闭取决于使用的是哪个DataSource,一般情况下,当使用连接池时,连接将返回池中,而不是实际关闭连接。

【讨论】:

是一直被调用的close() 方法吗?因为在我的程序中,我需要 Spring 来不关闭连接,所以如果保证它是 close(),我可以覆盖该方法。 如前所述,这取决于。如果您有具体问题,请提出问题,而不是通过 cmets 进行 if。【参考方案2】:

是的。

如果连接是从连接池中获得的,它实际上不会关闭连接,而是将其发送回连接池。

【讨论】:

它是如何实现的?【参考方案3】:

无需手动关闭连接。 Spring容器本身采取的操作。请参考这个春季网址,

http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html

【讨论】:

【参考方案4】:

我们也可以在使用jdbcTemplate时关闭连接,在某些情况下执行查询后必须关闭连接,否则会出现连接问题。更多详情请访问Close connection in jdbc template

jdbcTemplate.getDataSource().getConnection().close();

【讨论】:

我认为这会在调用getConnection() 时创建一个新的Connection,然后将其关闭,而原来的Connection 仍处于打开状态。它可能在某些情况下有效,但取决于使用的DataSource 的类型(例如SingleConnectionDataSource,因为它总是返回相同的Connection。)【参考方案5】:

通过查看JdbcTemplate的源码,有一个方法叫execute,它是其他一些查询方法的基础,比如queryForObjectqueryForList等等:

    @Nullable
    private <T> T execute(StatementCallback<T> action, boolean closeResources) throws DataAccessException 
        Assert.notNull(action, "Callback object must not be null");

        Connection con = DataSourceUtils.getConnection(obtainDataSource());
        Statement stmt = null;
        try 
            stmt = con.createStatement();
            applyStatementSettings(stmt);
            T result = action.doInStatement(stmt);
            handleWarnings(stmt);
            return result;
        
        catch (SQLException ex) 
            // Release Connection early, to avoid potential connection pool deadlock
            // in the case when the exception translator hasn't been initialized yet.
            String sql = getSql(action);
            JdbcUtils.closeStatement(stmt);
            stmt = null;
            DataSourceUtils.releaseConnection(con, getDataSource());
            con = null;
            throw translateException("StatementCallback", sql, ex);
        
        finally 
            if (closeResources) 
                JdbcUtils.closeStatement(stmt);
                DataSourceUtils.releaseConnection(con, getDataSource());
            
        
    

显然,当调用execute get时,数据库连接会在finally块中释放,因此查询超时后无需关闭连接。

【讨论】:

以上是关于Spring 的 JdbcTemplate 是不是在查询超时后关闭连接?的主要内容,如果未能解决你的问题,请参考以下文章

jdbcTemplate必须使用spring事务吗 否则不能提交

Spring JdbcTemplate 执行与更新

4Spring Boot 自动配置原理

Spring 从入门到精通系列 11—— Spring 中的 JdbcTemplate

Spring--JdbcTemplate

spring boot 与 JdbcTemplate 一起工作