DataSource.getConnection()老是從datasource或鏈接池返回一個新的鏈接。
經過調用 jdbcTemplate.getDataSource().getConnection()顯式獲取一個鏈接,這個鏈接不是方法事務上下文線程綁定的鏈接,因此若是開發者若是沒有手工釋放這鏈接(顯式調用 Connection#close() 方法
),則這個鏈接將永久被佔用(處於 active 狀態),形成鏈接泄漏!java
Spring 提供了一個能從當前事務上下文中獲取綁定的數據鏈接的工具類,那就是 DataSourceUtils。Spring 的 JdbcTemplate 內部也是經過 DataSourceUtils 來獲取鏈接的。
DataSourceUtils 提供了若干獲取和釋放數據鏈接的靜態方法,說明以下:
static Connection doGetConnection(DataSource dataSource):首先嚐試從事務上下文中獲取鏈接,失敗後再從數據源獲取鏈接;
static Connection getConnection(DataSource dataSource):和 doGetConnection 方法的功能同樣,實際上,它內部就是調用 doGetConnection 方法獲取鏈接的;
static void doReleaseConnection(Connection con, DataSource dataSource):釋放鏈接,放回到鏈接池中;
static void releaseConnection(Connection con, DataSource dataSource):和 doReleaseConnection 方法的功能同樣,實際上,它內部就是調用 doReleaseConnection 方法獲取鏈接的;spring
DataSourceUtils.getConnection()它首先查看當前是否存在事務管理上下文,並嘗試從事務管理上下文獲取鏈接,若是獲取失敗,直接從數據源中獲取鏈接。在獲取鏈接後,若是當前擁有事務上下文,則將鏈接綁定到事務上下文中。若是處於事務上下文中,那麼開發者不須要顯示關閉或者釋放鏈接,可是若是 DataSourceUtils 在沒有事務上下文的方法中使用 getConnection() 獲取鏈接,依然會形成數據鏈接泄漏,這個時候就須要顯示release了 !
工具
DataSourceUtils.releaseConnection(conn,jdbcTemplate.getDataSource());
參考:http://stackoverflow.com/ques...
https://www.ibm.com/developer...線程