Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

स्प्रिंग जेपीए (हाइबरनेट) इकाई प्रबंधक के साथ कनेक्शन पूल में कनेक्शन कब लौटाए जाते हैं?

यह बिल्कुल भी जटिल नहीं है।

  1. सबसे पहले, आपको यह समझने की आवश्यकता है कि स्प्रिंग लेनदेन प्रबंधक केवल एक लेनदेन प्रबंधन अमूर्त है। आपके मामले में, वास्तविक लेनदेन JDBC कनेक्शन स्तर पर होता है।

  2. सभी @Transactional सर्विस मेथड कॉल्स को TransactionInterceptor . द्वारा इंटरसेप्ट किया जाता है पहलू।

  3. TransactionIntreceptor वर्तमान कॉन्फ़िगर किए गए AbstractPlatformTransactionManager कार्यान्वयन (JpaTransactionManager आपके मामले में)।

  4. JpaTransactionManager वर्तमान चल रहे स्प्रिंग लेनदेन को एक EntityManager से जोड़ देगा, इसलिए वर्तमान लेनदेन में भाग लेने वाले सभी DAO समान दृढ़ता संदर्भ साझा करते हैं।

  5. JpaTransactionManager बस EntityManager . का उपयोग करता है लेनदेन को नियंत्रित करने के लिए लेनदेन एपीआई:

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

जेपीए लेनदेन एपीआई केवल अंतर्निहित जेडीबीसी कनेक्शन प्रतिबद्ध/रोलबैक विधियों को कॉल का प्रतिनिधित्व करता है।

  1. जब लेन-देन किया जाता है (प्रतिबद्ध/रोलबैक), org.hibernate.engine.transaction.internal.jdbc.JdbcTransaction कॉल:

     transactionCoordinator().getTransactionContext().managedClose();
    

जो एक हाइबरनेट सत्र (इकाई प्रबंधक) को बंद कर देता है।

  1. इसलिए अंतर्निहित JDBC कनेक्शन को भी बंद करने के लिए ट्रिगर किया गया है:

     jdbcCoordinator.close();
    
  2. हाइबरनेट में एक तार्किक 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 कनेक्शन पर क्लोज मेथड को कॉल करता है:

     @Override
     public void closeConnection(Connection connection) throws SQLException {
          connection.close();
     }
    
  4. किसी भी अन्य कनेक्शन पूलिंग डेटासोर्स की तरह, JDBC कनेक्शन क्लोज केवल पूल से कनेक्शन लौटाता है और भौतिक डेटाबेस कनेक्शन को बंद नहीं करता है। ऐसा इसलिए है क्योंकि कनेक्शन पूलिंग डेटासोर्स एक JDBC कनेक्शन प्रॉक्सी देता है जो सभी कॉलों को इंटरसेप्ट करता है और कनेक्शन पूल हैंडलिंग लॉजिक के समापन को दर्शाता है।

ध्यान दें कि RESOURCE_LOCAL लेनदेन के लिए, आपको hibernate.connection.provider_disables_autocommit संपत्ति अगर autocommit कनेक्शन पूल द्वारा चेक अक्षम कर दिया गया था। इस तरह, SQL क्वेरी निष्पादित करने या Persistence Context को फ़्लश करने से पहले डेटाबेस कनेक्शन आलसी रूप से प्राप्त किए जाने वाले हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. कई पंक्तियों में कुछ मान होने की संख्या की गणना करने के लिए SQL क्वेरी

  2. डेटाटाइम का समर्थन करने के लिए पायथन JSON एन्कोडर?

  3. MySQL:आप खंड से अद्यतन के लिए लक्ष्य तालिका 'कार्य' निर्दिष्ट नहीं कर सकते हैं

  4. JDBC इंटरफ़ेस के माध्यम से MySQL में UTF-8 स्ट्रिंग्स को सही ढंग से कैसे लिखें?

  5. मैं PHP का उपयोग करके MySQL डीबी में बड़ी फाइलें कैसे सम्मिलित कर सकता हूं?