【问题标题】:DataSourceUtils.getConnection vs DataSource.getConnectionDataSourceUtils.getConnection 与 DataSource.getConnection
【发布时间】:2012-03-27 09:51:27
【问题描述】:

我在 spring 上下文中初始化了数据源 bean。我想知道应该使用什么方式?为什么我就是不能写 dataSource.getConnection()?

【问题讨论】:

    标签: java spring


    【解决方案1】:

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

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

    【讨论】:

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

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

    【讨论】:

    • 那么如果我正在运行事务并通过dataSource.getConnection() 获得连接,该连接将不会绑定到当前事务?
    猜你喜欢
    • 1970-01-01
    • 2017-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-02
    • 1970-01-01
    • 2016-03-23
    相关资源
    最近更新 更多