sql >> データベース >  >> RDS >> Mysql

Spring JPA(Hibernate)Entity Managerを使用して接続が接続プールに返されるのはいつですか?

    まったく複雑ではありません。

    1. まず、Springトランザクションマネージャーはトランザクション管理の抽象化にすぎないことを理解する必要があります。あなたの場合、実際のトランザクションはJDBC接続レベルで発生します。

    2. すべての@Transactional サービスメソッドの呼び出しは、TransactionInterceptorによってインターセプトされます アスペクト。

    3. TransactionIntreceptor トランザクション管理を現在構成されている AbstractPlatformTransactionManager 実装(JpaTransactionManager あなたの場合)。

    4. JpaTransactionManager 現在実行中のSpringトランザクションをEntityManagerにバインドするため、現在のトランザクションに参加しているすべてのDAOは同じ永続コンテキストを共有します。

    5. JpaTransactionManager 単にEntityManagerを使用します トランザクションを制御するためのトランザクションAPI:

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

    JPA Transaction APIは、基になるJDBC接続のコミット/ロールバックメソッドに呼び出しを委任するだけです。

    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();
       }
      
    3. 論理接続は、現在構成されている接続プロバイダー(DataSourceConnectionProvider)にクローズ呼び出しを委任します あなたの場合)、JDBC接続でcloseメソッドを呼び出すだけです:

       @Override
       public void closeConnection(Connection connection) throws SQLException {
            connection.close();
       }
      
    4. 他の接続プーリングデータソースと同様に、JDBC接続を閉じると、接続がプールに返されるだけで、物理データベース接続は閉じられません。これは、接続プールのデータソースが、すべての呼び出しをインターセプトし、接続プール処理ロジックにクローズを委任するJDBC接続プロキシを返すためです。

    RESOURCE_LOCALトランザクションの場合、 hibernate.connection.provider_disables_autocommit autocommitの場合のプロパティ チェックは接続プールによって無効にされました。このようにして、SQLクエリを実行したり、永続コンテキストをフラッシュしたりする前に、データベース接続が遅延して取得されます。




    1. SQLデータベースの回復保留中のアクセス拒否の問題を修正

    2. アンダースコアがOracleのような句で機能していません

    3. Woocommerceは製品SKUを使用して製品IDを取得します

    4. フィールドに$xが含まれていないSQLクエリ