【发布时间】:2012-03-27 09:51:27
【问题描述】:
我在 spring 上下文中初始化了数据源 bean。我想知道应该使用什么方式?为什么我就是不能写 dataSource.getConnection()?
【问题讨论】:
我在 spring 上下文中初始化了数据源 bean。我想知道应该使用什么方式?为什么我就是不能写 dataSource.getConnection()?
【问题讨论】:
有一个重要区别:dataSource.getConnection() 总是返回从数据源或连接池获得的新连接。 DataSourceUtils.getConnection() 检查当前线程是否有活动事务。如果有,它将返回与此事务的连接。如果没有,它的行为方式与dataSource.getConnection() 完全相同。
使用DataSourceUtils.getConnection() 时需要小心。如果它为活动事务返回连接,则意味着其他人将关闭它,因为这是打开事务的人的责任。另一方面,如果它从数据源返回一个全新的连接,那么你应该提交/回滚/关闭它。
【讨论】:
dataSource.getConnection() 获得连接,该连接将不会绑定到当前事务?
DataSourceUtils.releaseConnection() 的 javadoc 声明:“如果未在外部管理(即未绑定到线程),则关闭从给定 DataSource 获得的给定连接。”这表明在使用完连接(从 DataSourceUtils.getConnection() 获得)后调用此方法总是安全的,并且不需要知道连接是否参与实际事务。
DataSourceUtils#getConnection() 非常清楚地记录了您可能想要使用它的原因:特别是,它使用 Spring JDBC 异常层次结构而不是原始 SQL 异常,并且它将参与 Spring 的事务管理工具。如果您不需要这两个功能中的任何一个,您可以使用 DataSource#getConnection() 并继续使用您的代码。
【讨论】:
dataSource.getConnection() 获得连接,该连接将不会绑定到当前事务?