Java DataSourceUtils.getConnection与DataSource.getConnection

Java DataSourceUtils.getConnection与DataSource.getConnection,java,spring,Java,Spring,我已经在spring上下文中初始化了DataSourceBean。我想知道应该用什么方法?为什么我不能编写dataSource.getConnection()?非常清楚地记录了您可能想要使用它的原因:特别是,它使用Spring JDBC异常层次结构,而不是原始SQL异常,并且它将参与Spring的事务管理功能。如果您不需要这两个功能中的任何一个,您可以使用DataSource#getConnection()继续编写代码。有一个重要区别:DataSource.getConnection()始终返回

我已经在spring上下文中初始化了DataSourceBean。我想知道应该用什么方法?为什么我不能编写dataSource.getConnection()?

非常清楚地记录了您可能想要使用它的原因:特别是,它使用Spring JDBC异常层次结构,而不是原始SQL异常,并且它将参与Spring的事务管理功能。如果您不需要这两个功能中的任何一个,您可以使用
DataSource#getConnection()
继续编写代码。

有一个重要区别:
DataSource.getConnection()
始终返回从数据源或连接池获得的新连接
DataSourceUtils.getConnection()
检查当前线程是否有活动事务。如果有,它将返回与此事务的连接。如果没有,它的行为方式将与
dataSource.getConnection()
完全相同


使用
DataSourceUtils.getConnection()时需要小心。如果它返回活动事务的连接,则意味着其他人将关闭它,因为这是打开事务的人的责任。另一方面,如果它从数据源返回一个全新的连接,那么您应该提交/回滚/关闭它。

因此,如果我正在运行事务并通过
dataSource.getConnection()获取连接
该连接将不会绑定到当前事务?因此,如果我正在运行事务并通过
dataSource.getConnection()
获取连接,该连接将不会绑定到当前事务?@mishanesterenko否,dataSource.getConnection()将始终直接从数据库或没有活动事务的池返回“新鲜”连接。从
DataSourceUtils.releaseConnection()
的javadoc中,它声明:“关闭从给定数据源获得的给定连接,如果它没有外部管理(即,没有绑定到线程)。”这意味着在使用完连接(从
DataSourceUtils.getConnection()
)后调用此方法总是安全的,并且不需要知道连接是否参与了实际事务。