2012-03-15 5 views
11

मेरे पास एक जावा ऐप है जो पोस्टग्रेस डेटाबेस का उपयोग करता है और मैं अपने डेटाबेस को स्केल करने के लिए PGPool पेश करने का प्रयास कर रहा हूं। मैं एक समस्या में भाग रहा हूं जहां पोस्टग्रेस निम्न त्रुटि फेंकता है: unnamed prepared statement does not exist। Postgres पर लॉगिंग क्रेंकिंग के बाद मैं देख रहा हूँ निम्नलिखित सामान हर चुनिंदा बयान मेरे ऐप कार्यान्वित के लिए हो रहा:पीजीपीूल II के खिलाफ जावा प्रश्न "अज्ञात तैयार कथन मौजूद नहीं है" त्रुटियां

EDTLOG: 00000: duration: 7.585 ms parse <unnamed>: "my select statement here" 
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here" 
EDTLOG: 00000: duration: 79.014 ms execute <unnamed>: "my select statement here" 

लेकिन कभी कभी, पार्स/बाँध/निष्पादित चरणों PGPool कुछ अतिरिक्त प्रश्नों निष्पादित करेंगे के बीच है, ताकि लॉग ,

EDTLOG: 00000: duration: 7.585 ms parse <unnamed>: "my select statement here" 
EDTLOG: 00000: duration: 0.088 ms bind <unnamed>: "my select statement here" 
EDTLOG: 00000: duration: 0.328 ms statement: SELECT count(*) FROM pg_class AS c, pg_namespace AS n WHERE c.relname = 'my_table' AND c.relnamespace = n.oid AND n.nspname = 'pg_catalog' 
EDTLOG: 00000: duration: 79.014 ms execute <unnamed>: "my select statement here" 
EDTERROR: 26000: unnamed prepared statement does not exist 
EDTLOG: 00000: duration: 0.022 ms parse S_2: ROLLBACK 
EDTLOG: 00000: duration: 0.005 ms bind S_2: ROLLBACK 
EDTLOG: 00000: duration: 0.008 ms execute S_2: ROLLBACK 

मैं क्या समझ से, क्योंकि क्वेरी अज्ञात है यह Postgres द्वारा दूर फेंक दिया जाता है, तो किसी अन्य क्वेरी से पहले अज्ञात क्वेरी निष्पादित किया जाता है कि डेटाबेस सत्र के दौरान में आती है: इस तरह दिखता है। इसलिए क्योंकि पीजीपीूल कभी-कभी पार्स/बाइंड/निष्पादित चरणों के बीच इन अतिरिक्त प्रश्नों को जारी कर रहा है, जिससे क्वेरी को फेंक दिया जा रहा है।

मेरा पहला विचार यह था कि शायद मेरे जावा ऐप को प्रत्येक क्वेरी के लिए पार्स/बाइंड/निष्पादित स्टेटमेंट भेजने की आवश्यकता नहीं थी। लेकिन ऐसा लगता है कि जेडीबीसी संस्करण 3 और पोस्टग्रेस 7.4 http://jdbc.postgresql.org/documentation/head/server-prepare.html के बाद से पोस्टग्रेस जेडीबीसी ड्राइवर के लिए यह डिफ़ॉल्ट व्यवहार है। मुझे लगता है कि मैं पूरी तरह से सर्वर पक्ष तैयार कथन अक्षम करने का प्रयास कर सकता हूं, लेकिन दस्तावेज़ीकरण यह निर्दिष्ट नहीं करता है कि यह कैसे करें, और मुझे यकीन नहीं है कि मैं ऐसा कुछ भी करना चाहता हूं।

मेरा दूसरा विचार था कि पीजीपीूल II को उन मेटा डेटा प्रश्नों को बंद करना बंद करना था। चूंकि मैं सिर्फ लोड बैलेंसर के रूप में पीजीपीूल का उपयोग करने की कोशिश कर रहा हूं, इसलिए मुझे वास्तव में नहीं लगता कि इसे मेरे टेबल मेटाडेटा के बारे में सब कुछ जानने की आवश्यकता क्यों है। मैंने कोड को ट्रैक किया है जो पीजीपीूल स्रोत के is_system_catalog विधि में उन प्रश्नों को निष्पादित कर रहा है: https://github.com/iakio/pgpool-II/blob/master/pool_select_walker.c#L256 ऐसा लगता है कि पीजीपीूल किसी कारण से मेरे टेबल संबंधों के बारे में जानना चाहता है, और दुर्भाग्य से मैं उस व्यवहार को अक्षम करने का कोई तरीका नहीं देख रहा हूं।

इस मुद्दे के आसपास काम करने के तरीके पर कोई अंतर्दृष्टि की सराहना की जाएगी।

मेरी पर्यावरण के बारे में कुछ जानकारी:

JDBC Driver: postgresql-9.1-901.jdbc4.jar 
Java version "1.6.0_31" 
Spring 3.1 managed JPA 
Hibernate 3.5 
Postgres 9.1 

अद्यतन: मैं इस मुद्दे के लिए एक वैकल्पिक हल मिल गया। जेडीबीसी यूआरएल में protocolVersion=2 डालकर यह मूल रूप से पोस्टग्रेस जेडीबीसी ड्राइवर को सर्वर पक्ष तैयार कथन का उपयोग न करने के लिए कहता है। यह मेरे डेटाबेस के सामने PGPool II का उपयोग करते समय मेरे ऐप को चलाने की अनुमति देता है। मुझे इस तथ्य से परेशान है कि मुझे पीजीपीूल का उपयोग करने के लिए जेडीबीसी संस्करण 2 प्रोटोकॉल पर वापस आना होगा।

+0

@Zecas हाँ मुझे पता है कि साइट कैसे काम करती है, आपको मुझे यह समझाने की आवश्यकता नहीं है। मेरे पास अभी भी कोई समाधान नहीं है जो मुझे पीजीपीूल II के खिलाफ जेडीबीसी के नवीनतम संस्करण का उपयोग करने की अनुमति देता है। जहां तक ​​मेरा संबंध है, यह अभी भी एक खुला प्रश्न है। –

+0

आप यह सुनिश्चित करना चाहते हैं कि लेनदेन के अंदर आपके प्रश्न चल रहे हों। यदि एक ही लेनदेन एक ही कनेक्शन पर आता है तो तैयार कथन को त्याग दिया जा रहा है। डिफ़ॉल्ट रूप से, postgresql jdbc ड्राइवर लेनदेन का उपयोग नहीं करता है, जो मेरे लिए थोड़ा अजीब लगता है। यदि मुझे याद है तो आप persistence.xml में लेनदेन संबंधी व्यवहार सेट कर सकते हैं। – PlexQ

+0

आप PgPool का उपयोग क्यों कर रहे हैं? क्या आप अपने ऐप के भीतर कनेक्शन पूल को सीधे प्रबंधित करने के लिए डीबीसीपी, बोनसीपी या सी 3 पी 0 का उपयोग नहीं कर सकते? – Chochos

उत्तर

1

मैं इस मुद्दे के लिए एक वैकल्पिक हल मिल गया। जेडीबीसी यूआरएल में प्रोटोकॉल वर्जन = 2 डालकर यह मूल रूप से पोस्टग्रेस जेडीबीसी ड्राइवर को सर्वर पक्ष तैयार कथन का उपयोग न करने के लिए कहता है। यह मेरे डेटाबेस के सामने PGPool II का उपयोग करते समय मेरे ऐप को चलाने की अनुमति देता है। मुझे इस तथ्य से परेशान है कि मुझे पीजीपीूल का उपयोग करने के लिए जेडीबीसी संस्करण 2 प्रोटोकॉल पर वापस आना होगा।

+2

सर्वर पक्ष तैयार बयानों से बचने का एक और विकल्प पैरामीटर 'तैयार थ्रेसहोल्ड' का उपयोग वास्तव में निष्पादन की उच्च संख्या के साथ करना होगा। –

-1

यदि आप अपना तैयार कथन नाम देते हैं तो क्या होगा?

और एक और सवाल उठता है: यदि आपको उनकी आवश्यकता नहीं है, तो आप तैयार कथन का उपयोग क्यों करते हैं?

आप आसानी से JDBC ड्राइवर के खिलाफ "सामान्य" बयान देने के कर सकते हैं ...

+0

मैं सिर्फ जेपीए प्रश्नों का उपयोग कर रहा हूं। हाइबरनेट तब तैयार बयान तैयार कर रहा है और उन्हें जेडीबीसी चालक को भेज रहा है। हालांकि, मैंने पोस्टग्रेएसक्यूएल जेडीबीसी चालक के बारे में जो पढ़ा है, उससे तैयार वक्तव्यों के बिना पैरामीटरयुक्त बयान करने का कोई तरीका नहीं है। और चलिए इसका सामना करते हैं, बहुत सारे प्रश्नों में पैरामीटर हैं। और मैं तैयार बयानों का नाम नहीं दे सकता क्योंकि मैं उन्हें बनाने वाला नहीं हूं, हाइबरनेट है। –

संबंधित मुद्दे