Spring DataSourceUtils.getConnection与DataSource.getConnection

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...线程

相关文章
相关标签/搜索