2016-12-01 357 views
0

在Spring Boot中,jdbcTemplate在执行查询后不会自动关闭连接吗? 在这种情况下,我正在使用jdbcTemplate(它连接到teradata)执行查询,但会话在查询执行后未关闭。我如何关闭会话?如何在jdbcTemplate执行查询后关闭Spring Boot中的连接?

这是我的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; 
    } 

} 
+0

如果您使用的是maven,则plz共享pom.xml。 –

回答

0

JdbcTemplate会从javax.sql.DataSource实现它的连接 - 这是传递给它的构造link

DataSource可以均是基本(创建用于每个请求Connection对象)或汇集(具有连接池和只是“借用”一个用于给定请求的用途)。

因此,看起来连接没有关闭,因为您已将一些池数据源传递给名为devbJdbcJdbcTemplate。如果你真的要关闭开做JdbcTemplate工作的每个连接,你可以使用一个基本DataSource实现:org.springframework.jdbc.datasource.SimpleDriverDataSource就是这样:

@Configuration 
class DevbConfig { 

    @Bean(name = "devbDataSource") 
    DataSource devbDataSource() { 
     try { 
      return new SimpleDriverDataSource(DriverManager.getDriver("jdbc:..."), "jdbc:...", "username", "password"); 
     } catch (SQLException e) { 
      throw new RuntimeException(e); 
     } 
    } 

    @Bean(name = "devbJdbc") 
    JdbcTemplate devbJdbc(@Qualifier("devbDataSource") DataSource dataSource) { 
     return new JdbcTemplate(dataSource); 
    } 

} 
0

在春天启动,并JdbcTemplate的不关闭连接 自动一次它执行查询后?

它应该关闭连接还是将其返回到连接池(以防数据源被共享)?

如果您在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(); 
    } 
} 

最有可能的,如果数据源实例池,连接是释放回重用和不关闭。

0

根据弹簧启动的文档,你可以分配的最大连接数的泉池,像这样:

spring.datasource.tomcat.max-active=50 

这显然只能与嵌入式Web服务器的工作。如果你将它部署到类似Jboss的东西,你必须在服务器配置文件中配置该属性。