पिछले सप्ताह की शुरुआत में, मैंने एक वास्तविक परियोजना पर काम करना शुरू किया जो एक रेडियो स्टेशन के लिए ऑडियो सामग्री का प्रबंधन करती है। VAADIN ढांचे (
https://vaadin.com/home ) का उपयोग करने वाला सामान्य व्यवस्थापक पैनल उपयोगकर्ता को एक वेब इंटरफ़ेस प्रदान करता है जो आपको प्लेलिस्ट और अन्य सुविधाओं को कॉन्फ़िगर करने की अनुमति देता है जो डीजे के जीवन को सरल बनाते हैं।
ग्राहक को आवेदन विरासत में मिला और वह अपनी कार्यक्षमता का विस्तार करना चाहता था और सिस्टम के संचालन के दौरान पहचाने जाने वाले कीड़े को ठीक करना चाहता था। मेरे लिए, यह एक पूरी तरह से सामान्य और तर्कसंगत इच्छा है।
मेरा एक कार्य एक डेटा सैंपलिंग बग को ठीक करना था। जैसा कि यह पता चला है, डेटाबेस ने खाली मानों के साथ डेटाबेस रिकॉर्ड को लिखा था, और जब लाते हैं, तो यह माना जाता था कि डेटा खाली नहीं था। डेटाबेस के साथ काम करने के लिए एप्लिकेशन हाइबरनेट के जेपीए कार्यान्वयन का उपयोग करता है। ठीक है, सिद्धांत रूप में, आश्चर्य की बात नहीं है, क्योंकि हाइबरनेट एक काफी सामान्य ढांचा है। मैं उनके साथ कई सालों से काम कर रहा हूं, लेकिन मैं पेशेवर नहीं हूं। इसके अलावा, डेटाबेस मॉडल और जावा ऑब्जेक्ट मॉडल आसान नहीं थे: चक्रीय निर्भरता, विरासत, कई-से-कई रिश्ते, आदि का उपयोग करना। सामान्य तौर पर, तुरंत, मॉडल को देखते हुए, मुझे समझ नहीं आया कि त्रुटि के कारण की तलाश कहाँ करें।
एसक्यूएल लॉगिंग के बारे में एक सवाल था कि यह निर्धारित करने के लिए कि सत्यापनकर्ता को छोड़ दिया गया है।
मुझे वास्तव में
hibernate.show_sql = सच्चे पैरामीटर का उपयोग करना पसंद नहीं था। मैंने दो समस्याएं देखीं:
1) System.out में हाइबरनेट प्रश्न चिह्न के साथ और वास्तविक मापदंडों के बिना केवल SQL क्वेरी लिखते हैं;
2) हाइबरनेट डेटाबेस के लिए सभी प्रश्नों को लिखता है (जैसा कि यह निकला, एक पृष्ठ पर आवेदन में लगभग 50 प्रश्नों का प्रदर्शन किया गया है)।
प्रदर्शित प्रश्नों को देखते हुए, मैंने महसूस किया कि मुझे केवल उन तालिकाओं के प्रश्नों को प्रदर्शित करने की आवश्यकता है जो मेरे कार्य से संबंधित हैं।
मदद के लिए Google की ओर मुड़ते हुए, मुझे सलाह मिली कि वास्तविक मापदंडों को कैसे प्रदर्शित किया जाए: Log4j का उपयोग करते समय, आपको मापदंडों के लिए एक लकड़हारा (
लेख के लिंक ) जोड़ने की आवश्यकता है:
# हाइबरनेट लॉगिंग विकल्प (INFO केवल स्टार्टअप संदेश दिखाता है)
log4j.logger.org.hibernate = जानकारी
# JDBC लॉग पैरामीटर रनटाइम तर्क लॉग करें
log4j.logger.org.hibernate.type = ट्रेस
इन इशारों के बाद, मैंने समस्या को हल किया नंबर 1: क्वेरी पैरामीटर लॉग में लिखे गए थे, लेकिन लॉग अत्यधिक बड़े हो गए, मुझे उस क्वेरी की तलाश करनी थी जिसकी मुझे कई मिनटों तक ज़रूरत थी। मुझे तुरंत एहसास हुआ कि यह काम नहीं करेगा और फिर विचार तब पैदा हुआ जब आवेदन क्वेरी लॉगिंग को चालू और बंद करने के लिए चल रहा था।
वर्तमान परियोजना डेटाबेस के साथ काम करने के लिए ईजेबी 3 घटकों का उपयोग करती है, इंटरसेप्टर्स के बारे में पढ़ने के बाद यह विचार उत्पन्न हुआ कि इसे मक्खी पर SQL क्वेरी लॉगिंग को सक्षम और अक्षम करने के लिए लिखना है।
कोड निम्नानुसार है:
सेवा से चयनित विधि के लिए लॉगिंग का उपयोग करने का एक उदाहरण:
@Override @Interceptors(ShowHibernateSQLInterceptor.class) public List<AudioItem> listAllAudioItems() { return em.createQuery("select a from AudioItem a").getResultList(); }
जब विधि को कॉल किया जाता है, तो डेटाबेस से AudioItem संस्थाओं के चयन से संबंधित सभी SQL क्वेरी लॉग में लिखे जाते हैं।
(यदि
@Interceptors (ShowHibernateSQLInterceptor.class) संपूर्ण सेवा वर्ग के लिए निर्दिष्ट किया गया है, और चयनित विधि के लिए नहीं, तो इस वर्ग के सभी तरीकों को लॉग किया जाएगा)
क्योंकि Hiberante लॉग में org.hibernate.SQL = DEBUG की आवश्यकता के कारण प्रश्नों को प्रदर्शित किया जाता है
hibernate.show_sql = true गायब हो गया है और मैंने इस सुविधा को अक्षम कर दिया है।
परिणाम:
केवल व्यक्तिगत विधियों को लॉग करने के लिए, यह अनुशंसा की जाती है:
1)
hibernate.show_sql = true अक्षम करें
2) इंटरसेप्टर क्लास लिखें
3) चयनित विधि के लिए एक इंटरसेप्टर जोड़ें।
प्रतिबंध:
1) केवल log4j के साथ परीक्षण किया गया - मुझे यकीन नहीं है कि यह किसी अन्य लकड़हारे के साथ काम करेगा, लेकिन मुझे लगता है कि परियोजना में Log4j को जोड़ना संभव है, या किसी अन्य लकड़हारे के लिए इंटरसेप्टर को समायोजित करना
2) प्रस्तावित समाधान केवल ईजेबी 3 के लिए प्रासंगिक है, यदि परियोजना स्प्रिंग का उपयोग करती है, तो आपको समान कार्यक्षमता के साथ एक पहलू (स्प्रिंग एओपी) लिखने की आवश्यकता है।
3) JBoss AS पर परीक्षण किया गया: यह सर्वर Log4j के लिए अपने लकड़हारे एडाप्टर का उपयोग करता है। इसलिए, इसे किसी अन्य सर्वर पर काम करना चाहिए, लेकिन बारीकियां हो सकती हैं ...
शायद इस समस्या के लिए अधिक सुरुचिपूर्ण समाधान हैं, लेकिन Google पर खोज परिणामों की त्वरित समीक्षा ने मुझे ऐसा खोजने की अनुमति नहीं दी, इसलिए मैंने 20 मिनट बिताने का फैसला किया और समस्या हल हो गई और, परिणामस्वरूप, कार्य समय पर पूरा हो गया।
यदि कोई बेहतर समाधान जानता है, तो मैं इसे सुनने के लिए तैयार हूं - क्योंकि कभी-कभी मुझे हाइबरनेट अनुरोधों का विश्लेषण करने के लिए एक उपकरण की आवश्यकता होती है, जो कार्य को जल्दी से हल करने में मदद करेगा।