如何在jdbcTemplate执行查询后关闭Spring Boot中的连接?

时间:2016-12-01 14:32:05

标签: java spring jdbc spring-boot jdbctemplate

在Spring Boot中,jdbcTemplate在执行查询后是否会自动关闭连接一次? 在这种情况下,我正在使用jdbcTemplate(它连接到teradata)执行查询,但在执行查询后会话没有关闭。我该如何关闭会话?

这是我的dao文件 -

@Component
public class DDLReviewDao { 

    @Autowired
    @Qualifier("devbJdbc")
    private JdbcTemplate jdbcTemplate;

    public static final Logger logger = LogManager.getLogger(DDLReviewDao.class);

    public List<DDLObject> getDDLReviewData(DDLQuery ddlQuery) {

        String selectSql = MacroGenerator.generateMacro(ddlQuery);                  
        List<DDLObject> ddlObject = jdbcTemplate.query(selectSql, new DDLMapper());                 
        logger.info(ddlObject);
        return ddlObject;
    }

}

3 个答案:

答案 0 :(得分:1)

JdbcTemplatejavax.sql.DataSource实现获取其连接 - 将其传递给其构造函数link

DataSource可以基本(为每个请求创建Connection个对象)或汇集(有连接池,只有&# 39;借用给定请求的一个用途。

因此,似乎连接没有关闭,因为您已将一些池数据源传递给名为JdbcTemplate的{​​{1}}。如果您真的想要关闭所有打开的连接来执行devbJdbc工作,您可以使用基本的JdbcTemplate实施:DataSource就像这样:

org.springframework.jdbc.datasource.SimpleDriverDataSource

答案 1 :(得分:0)

  

在Spring Boot中,jdbcTemplate不会关闭连接   在执行查询后自动执行一次?

它应该关闭连接还是将其返回到连接池(如果汇集了DataSource)?

如果你在http://grepcode.com/file/repo1.maven.org/maven2/org.springframework/spring-jdbc/4.1.7.RELEASE/org/springframework/jdbc/core/JdbcTemplate.java#JdbcTemplate.execute%28org.springframework.jdbc.core.StatementCallback%29阅读了源代码,那么归结为:

public static void doReleaseConnection(Connection con, DataSource dataSource) throws SQLException {
    if (con == null) {
        return;
    }
    if (dataSource != null) {
        ConnectionHolder conHolder = (ConnectionHolder) TransactionSynchronizationManager.getResource(dataSource);
        if (conHolder != null && connectionEquals(conHolder, con)) {
            // It's the transactional Connection: Don't close it.
            conHolder.released();
            return;
        }
    }
    logger.debug("Returning JDBC Connection to DataSource");
    doCloseConnection(con, dataSource);
}

public static void doCloseConnection(Connection con, DataSource dataSource) throws SQLException {
    if (!(dataSource instanceof SmartDataSource) || ((SmartDataSource) dataSource).shouldClose(con)) {
        con.close();
    }
}

最有可能的是,如果汇集了DataSource实例,则会释放连接以供重用而不会关闭。

答案 2 :(得分:0)

根据spring boot docs,您可以为弹簧池分配最大连接数,如下所示:

@CrossOrigin
@RequestMapping(value = "/blaa/{startDate}/{endDate}", method = RequestMethod.GET)
public ResponseEntity<List<Nodes>> listsOfbla(@PathVariable Long startDate,
        @PathVariable Long endDate) {

    startEndDateRequestTotal.inc();

    List<Nodes> listOfbla= NodesService.getFromToData(startDate, endDate);

    LOG.info("GET Request was made with two paramaters ", startDate, endDate);
    for (int i = 0; i < listOfbla (); i++) {
        if (listOfbla(i).getStampm().equals(startDate)) {
            for (int j = 0; j < listOfbla (); j++) {
                if (listOfbla(j).getStampm().equals(endDate)) {
                    return new ResponseEntity<List<Nodes>>listOfbla HttpStatus.OK);
                }
            }
        } else {
            return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
        }
    }

    if (listOfbla.isEmpty()) {
        return new ResponseEntity<>(HttpStatus.NOT_FOUND);
    }
    LOG.info("Retruning Nodes objects from specified date");
    return new ResponseEntity<List<Nodes>>(listOfbla, HttpStatus.OK);
}

这显然只适用于嵌入式网络服务器。如果要将其部署到类似Jboss的东西,则必须在Server配置文件中配置该属性。