2016-12-01 151 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的東西,你必須在服務器配置文件中配置該屬性。

相關問題