Spring的JdbcTemplate会在查询超时后关闭连接吗?

时间:2013-12-06 08:57:21

标签: java database spring jdbc jdbctemplate

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

5 个答案:

答案 0 :(得分:13)

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

如果您没有Spring托管交易,那么JdbcTemplate会调用close()上的Connection方法。但是,如果由于Springs事务管理关闭已经存在连接,则连接将由Springs事务支持处理,而Spring事务支持也将调用close()上的Connection

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

如果实际关闭连接取决于使用哪个DataSource,通常在使用连接池时,连接将返回到池而不是实际关闭连接。

答案 1 :(得分:3)

是的。

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:0)

我们还可以在使用jdbcTemplete时关闭连接,在某些情况下,执行查询后必须关闭连接,否则会出现连接问题。有关更多详细信息,请访问    [在jdbc模板中关闭连接] [1] [1]:http://www.javaiq.in/2019/05/jdbctemplate.html

<pre>

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

答案 4 :(得分:0)

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

    @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块中释放,因此查询超时后无需关闭连接。