栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

什么时候使用Spring JPA(休眠)实体管理器将连接返回到连接池?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

什么时候使用Spring JPA(休眠)实体管理器将连接返回到连接池?

一点也不复杂。

  1. 首先,您需要了解Spring事务管理器只是事务管理的抽象。在您的情况下,实际的事务发生在JDBC连接级别。

  2. Aspect

    @Transactional
    将拦截所有服务方法调用
    TransactionInterceptor

  3. TransactionIntreceptor
    委托事务管理当前的配置
    AbstractPlatformTransactionManager
    实现(
    JpaTransactionManager
    你的情况)。

  4. JpaTransactionManager
    会将当前正在运行的Spring事务绑定到EntityManager,因此参与当前事务的所有DAO共享相同的持久性上下文。

  5. JpaTransactionManager
    只需使用
    EntityManager
    Transaction API来控制交易即可:

        EntityTransaction tx = txObject.getEntityManagerHolder().getEntityManager().getTransaction();     tx.commit();

JPA Transaction API只是将调用委托给基础的JDBC Connection提交/回滚方法。

  1. 事务完成(提交/回滚)后,将
    org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction
    调用:
    transactionCoordinator().getTransactionContext().managedClose();

这会触发hibernate会话(实体管理器)关闭。

  1. 因此,也会触发基础JDBC连接的关闭:

    jdbcCoordinator.close();
  2. Hibernate具有逻辑JDBC连接句柄:

        @Override    public Connection close() {        LOG.tracev( "Closing JDBC container [{0}]", this );        if ( currentBatch != null ) {        LOG.closingUnreleasedBatch(); currentBatch.release();        }        cleanup();        return logicalConnection.close();    }
  1. 逻辑连接将close调用委派给当前配置的连接提供程序(
    DataSourceConnectionProvider
    在您的情况下),该提供程序仅在JDBC连接上调用close方法:
        @Override    public void closeConnection(Connection connection) throws SQLException {         connection.close();    }
  1. 像任何其他连接池DataSource一样,JDBC连接关闭只会将连接返回到池,而不会关闭物理数据库连接。这是因为连接池数据源返回一个JDBC连接代理,该代理拦截所有调用并将结束事务委托给连接池处理逻辑。

您还可以找到关于此主题的更多细节,以及为什么需要设置

hibernate.connection.provider_disables_autocommit
与Hibernate属性在这篇文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447595.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号