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

वसंत डेटा जेपीए क्वेरी में @lock टाइमआउट कैसे निर्दिष्ट करें?

स्प्रिंग डेटा 1.6 या अधिक के लिए

@Lock स्प्रिंग डेटा जेपीए के संस्करण 1.6 के अनुसार सीआरयूडी विधियों पर समर्थित है (वास्तव में, पहले से ही एक मील का पत्थर उपलब्ध)। यह देखें टिकट अधिक जानकारी के लिए।

उस संस्करण के साथ आप बस निम्नलिखित की घोषणा करते हैं:

interface WidgetRepository extends Repository<Widget, Long> {

  @Lock(LockModeType.PESSIMISTIC_WRITE)
  Widget findOne(Long id);
}

यह कॉन्फ़िगर किए गए LockModeType को find(…) पर लागू करने के लिए बैकिंग रिपॉजिटरी प्रॉक्सी के CRUD कार्यान्वयन भाग का कारण बनेगा। EntityManager पर कॉल करें ।

दूसरी ओर,

स्प्रिंग डेटा 1.6 के पिछले संस्करण के लिए

स्प्रिंग डेटा निराशावादी @Lock एनोटेशन केवल प्रश्नों पर लागू होते हैं (जैसा कि आपने बताया)। ऐसी कोई टिप्पणियां नहीं हैं जिनके बारे में मुझे पता है जो पूरे लेन-देन को प्रभावित कर सकती हैं। आप या तो एक findByOnePessimistic . बना सकते हैं विधि जो findByOne . को कॉल करती है निराशावादी लॉक के साथ या आप findByOne . को बदल सकते हैं हमेशा निराशावादी ताला पाने के लिए।

यदि आप अपना स्वयं का समाधान लागू करना चाहते हैं तो आप शायद कर सकते हैं। हुड के तहत @Lock एनोटेशन LockModePopulatingMethodIntercceptor . द्वारा संसाधित किया जाता है जो निम्न कार्य करता है:

TransactionSynchronizationManager.bindResource(method, lockMode == null ? NULL : lockMode);

आप कुछ स्टैटिक लॉक मैनेजर बना सकते हैं जिसमें एक ThreadLocal<LockMode> . था सदस्य चर और उसके बाद प्रत्येक भंडार में प्रत्येक विधि के चारों ओर लपेटा एक पहलू होता है जिसे बाइंड रिसोर्स कहा जाता है जिसमें थ्रेडलोकल में लॉक मोड सेट होता है। यह आपको प्रति-थ्रेड आधार पर लॉक मोड सेट करने की अनुमति देगा। फिर आप अपना खुद का @MethodLockMode . बना सकते हैं एनोटेशन जो विधि को उस पहलू में लपेटता है जो विधि को चलाने से पहले थ्रेड-विशिष्ट लॉक मोड सेट करता है और विधि को चलाने के बाद इसे साफ़ करता है।

संसाधन लिंक:

  1. Spring Data JPA के साथ निकायों को खोजते समय LockModeType.PESSIMISTIC_WRITE को कैसे सक्षम करें?
  2. कस्टम कैसे जोड़ें स्प्रिंग डेटा जेपीए के लिए विधि
  3. Spring Data Pessimistic Lock Timeout with Postgres
  4. JPA Query API

निराशावादी लॉक टाइमआउट के विभिन्न उदाहरण

निराशावादी लॉक सेट करना

एंटिटी ऑब्जेक्ट को लॉक विधि द्वारा स्पष्ट रूप से लॉक किया जा सकता है:

em.lock(employee, LockModeType.PESSIMISTIC_WRITE);

पहला तर्क एक इकाई वस्तु है। दूसरा तर्क अनुरोधित लॉक मोड है।

एक TransactionRequiredException यदि लॉक को कॉल करने पर कोई सक्रिय लेन-देन नहीं होता है, तो इसे फेंक दिया जाता है क्योंकि स्पष्ट लॉकिंग के लिए एक सक्रिय लेनदेन की आवश्यकता होती है।

एक LockTimeoutException यदि अनुरोधित निराशावादी ताला नहीं दिया जा सकता है तो फेंक दिया जाता है:

  • एक PESSIMISTIC_READ लॉक अनुरोध विफल हो जाता है यदि कोई अन्य उपयोगकर्ता (जिसे किसी अन्य EntityManager उदाहरण द्वारा दर्शाया गया है) वर्तमान में PESSIMISTIC_WRITE रखता है उस डेटाबेस ऑब्जेक्ट को लॉक करें।
  • एक PESSIMISTIC_WRITE यदि किसी अन्य उपयोगकर्ता के पास वर्तमान में PESSIMISTIC_WRITE है तो लॉक अनुरोध विफल हो जाता है लॉक या PESSIMISTIC_READ उस डेटाबेस ऑब्जेक्ट को लॉक करें।

क्वेरी हिंट सेट करना (स्कोप)

क्वेरी संकेत निम्नलिखित क्षेत्रों में सेट किए जा सकते हैं (वैश्विक से स्थानीय तक):

संपूर्ण दृढ़ता इकाई के लिए - persistence.xml . का उपयोग करके संपत्ति:

<properties>
   <property name="javax.persistence.query.timeout" value="3000"/>
</properties>

EntityManagerFactory के लिए - createEntityManagerFacotory . का उपयोग करके विधि:

Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 4000);
EntityManagerFactory emf =
  Persistence.createEntityManagerFactory("pu", properties);

EntityManager के लिए - createEntityManager . का उपयोग करके विधि:

Map<String,Object> properties = new HashMap();
properties.put("javax.persistence.query.timeout", 5000);
EntityManager em = emf.createEntityManager(properties);

या सेटप्रॉपर्टी विधि का उपयोग करना:

em.setProperty("javax.persistence.query.timeout", 6000);

named query . के लिए परिभाषा - hints . का उपयोग करना तत्व:

@NamedQuery(name="Country.findAll", query="SELECT c FROM Country c",
    hints={@QueryHint(name="javax.persistence.query.timeout", value="7000")})

एक विशिष्ट क्वेरी निष्पादन के लिए - setHint . का उपयोग करके विधि (क्वेरी निष्पादन से पहले):

query.setHint("javax.persistence.query.timeout", 8000);

संसाधन लिंक:

  1. JPA में लॉक करना
  2. निराशावादी लॉक टाइमआउट


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. पीएल/एसक्यूएल डेवलपर के साथ रिमोट ओरेकल डीबी से कैसे जुड़ें?

  2. क्या Oracle/PL SQL में RSA का उपयोग करने का कोई तरीका है?

  3. ASP.net MVC और Oracle के साथ कनेक्शन पूलिंग, अधिकतम पूल आकार में निर्दिष्ट से अधिक कनेक्शन की अनुमति देता है

  4. DATE का उपयोग करने वाली बाधाएं

  5. मैं ओरेकल के डेटाटाइप के स्ट्रिंग मान को उसके कोड से कैसे निर्धारित कर सकता हूं?