DataSourceUtils.getConnection与DataSource.getConnection

mic*_*nko 8 java spring

我在spring上下文中初始化了datasource bean.我想知道应该采用什么方式?为什么我只是不能写dataSource.getConnection()?

mre*_*isz 15

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

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

  • 因此,如果我正在运行事务并通过“dataSource.getConnection()”获取连接,该连接将不会绑定到当前事务? (2认同)
  • @mishanesterenko 不,dataSource.getConnection() 将始终直接从数据库或从没有活动事务的池中返回“新”连接。 (2认同)
  • 从`DataSourceUtils.releaseConnection()`的javadoc,它声明:"关闭给定的Connection,从给定的DataSource获得,如果它不是外部管理的(也就是说,没有绑定到线程)." 这表明在使用连接(从`DataSourceUtils.getConnection()`获得)之后调用此方法总是安全的,并且不需要知道连接是否参与实际事务. (2认同)
  • 10 年后仍然有帮助。干得好@mrembisz。 (2认同)