पोस्टग्रेज: "त्रुटि: कैश्ड प्लान में परिणाम प्रकार नहीं बदलना चाहिए"


114

यह अपवाद PostgreSQL 8.3.7 सर्वर द्वारा मेरे आवेदन पर फेंका जा रहा है। क्या किसी को पता है कि इस त्रुटि का क्या मतलब है और मैं इसके बारे में क्या कर सकता हूं?

ERROR:  cached plan must not change result type
STATEMENT:  select code,is_deprecated from country where code=$1

क्या आप कृपया PostreSQL का सटीक संस्करण साझा कर सकते हैं? 8.3.X?

जवाबों:


189

मुझे लगा कि इस त्रुटि के कारण क्या है।

मेरे आवेदन ने एक डेटाबेस कनेक्शन खोला और निष्पादन के लिए एक सेलेक्ट स्टेटमेंट तैयार किया।

इस बीच, एक अन्य स्क्रिप्ट डेटाबेस तालिका को संशोधित कर रही थी, उपरोक्त चयन विवरण में दिए जा रहे कॉलमों में से एक के डेटा प्रकार को बदलकर।

मैंने डेटाबेस टेबल को संशोधित करने के बाद एप्लिकेशन को पुनरारंभ करके इसे हल किया। यह डेटाबेस कनेक्शन को रीसेट करता है, तैयार स्टेटमेंट को त्रुटियों के बिना निष्पादित करने की अनुमति देता है।


4
मुझे यह पोस्टग्रेएसक्यूएल 9.0.4 पर मिला, रूबी ऑन रेल 3.1-प्री 5 के साथ। ऐसा लगता है कि यह ActiveRecord द्वारा स्वचालित रूप से हैंडल होना चाहिए, नहीं?
docwhat

3
हाँ, मुझे उम्मीद है कि ActiveRecord अंततः इसका ध्यान रखेगा। मेरा मानना ​​है कि यदि आप पुनः आरंभ करने से बचना चाहते हैं तो MyModel.reset_column_information कॉल को अल्पावधि में ठीक कर देगा।
हचिन्स

1
मैंने एक घंटा बर्बाद कर दिया और सोचा कि क्या गलत हुआ। आपके उत्तर ने मुझे बचा लिया!
श्री हर्ष कप्पाला

3
क्या आपको पता है कि किसी भी समाधान के लिए सभी एप्लिकेशन को पुनः आरंभ करने या सर्वर को पोस्ट करने की आवश्यकता नहीं है? हो सकता है कि त्रुटि होने पर कैश्ड योजना को मैन्युअल रूप से साफ़ करने के लिए कुछ समाधान हो?
जेसेक गेज़ल

1
स्प्रिंग + जेपीए एप्लिकेशन के लिए जेयूनेट परीक्षण चलाने के दौरान मुझे पोस्टग्रेज 10 पर भी यही समस्या थी। अपवाद संदेश org.postgresql.util.PSQLException: ERROR: cached plan must not change result type:। और सभी परीक्षण एक आकर्षण की तरह काम करते हैं, लेकिन केवल Repository.findById()। मैं अपने परीक्षणों में स्कीमा को नहीं बदलता, लेकिन मैं @FlywayTestप्रत्येक परीक्षण के लिए एक परीक्षण init डेटाबेस तैयार करने के लिए उपयोग कर रहा हूं । यदि मैं @FlywayTestएनोटेशन को हटाता हूं , तो यह अच्छी तरह से काम करता है।
बिनकोट

25

मैं ERROR: cached plan must not change result typeजावा / JDBC एप्लिकेशन के संदर्भ में समस्या को हल करने की कोशिश करते समय googling द्वारा यहां किसी के लिए भी इस उत्तर को जोड़ रहा हूं ।

मैं स्कीमा अपग्रेड (यानी DDL स्टेटमेंट) चलाकर त्रुटि को पुन: उत्पन्न करने में सक्षम था, जबकि डीबी का उपयोग करने वाला मेरा बैक-एंड ऐप था। यदि ऐप एक तालिका को क्वेरी कर रहा था जिसे स्कीमा अपग्रेड द्वारा बदल दिया गया था (यानी एक बदले हुए टेबल पर अपग्रेड से पहले और बाद में ऐप ने प्रश्नों को चलाया) - पोस्टग्रैज ड्राइवर इस त्रुटि को वापस करेगा क्योंकि स्पष्ट रूप से यह कुछ स्कीमा विवरणों का कैशिंग करता है।

आप अपने pgjdbcड्राइवर को कॉन्फ़िगर करके समस्या से बच सकते हैं autosave=conservative। इस विकल्प के साथ, चालक जो भी विवरण दे रहा है उसे कैशिंग कर सकता है और आपको अपने सर्वर को उछालने या अपने कनेक्शन पूल को फ्लश करने या जो भी वर्कअराउंड आपके साथ आया हो सकता है।

पोस्टग्रैस 9.6 (AWS RDS) पर पुन: प्रस्तुत किया गया और मेरे प्रारंभिक परीक्षण से संकेत मिलता है कि समस्या पूरी तरह से इस विकल्प के साथ हल हो गई है।

प्रलेखन: https://jdbc.postgresql.org/documentation/head/connect.html#connection.parameters

आप pgjdbc मुद्दे के अधिक विवरण और इतिहास के लिए जीथब मुद्दे को 451 पर देख सकते हैं ।


JRuby ActiveRecords उपयोगकर्ता इसे देखते हैं: https://github.com/jruby/activerecord-jdbc-adapter/blob/master/lib/arjdbc/postgresql-connection_methods.rb#L60


प्रदर्शन पर ध्यान दें:

उपरोक्त लिंक में बताए गए प्रदर्शन के मुद्दों के अनुसार - आपको आँख बंद करके इसे बदलने से पहले अपने आवेदन का कुछ प्रदर्शन / लोड / सोख परीक्षण करना चाहिए।

AWS RDS Postgres 10उदाहरण पर चल रहे मेरे अपने ऐप पर प्रदर्शन परीक्षण करने पर , conservativeसेटिंग सक्षम करने से डेटाबेस सर्वर पर अतिरिक्त CPU उपयोग होता है। हालांकि यह ज्यादा नहीं था, मैं केवल autosaveसीपीयू की एक औसत दर्जे की मात्रा का उपयोग करके कार्यक्षमता दिखा सकता था, क्योंकि मैं हर एक क्वेरी को लोड कर रहा था, जो मेरे लोड टेस्ट का उपयोग कर रही थी और लोड टेस्ट को जोर से धकेलना शुरू कर दिया।


7
यह डिफ़ॉल्ट क्यों नहीं है?
cdmckay

1
विज्ञापित के रूप में काम करता है। मेरे सरल परीक्षणों ने कोई प्रदर्शन प्रभाव नहीं दिखाया।
सैमुली पहाजा

1
Ruby Postgres ड्राइवर के साथ इसे कैसे कॉन्फ़िगर करें?
ऋषि

@Hrishi आपकी टिप्पणी ने मुझे यह एहसास कराया कि मूल प्रश्न वास्तव में जावा को निर्दिष्ट नहीं करता था (क्योंकि मैंने जावा संदर्भ में समस्या से निपटने के दौरान यह पाया था)। मैं कहूंगा कि आप रूबी के संदर्भ में एक नया प्रश्न स्पष्ट रूप से हल करना चाहते हैं।
शोर्न

@cdmckay क्योंकि यह 9.4-ish समय-सीमा संस्करण के आसपास ड्राइवर में पेश की गई नई कार्यक्षमता थी। अगर एक pgjdbc के कुछ नए संस्करण ने मेरे एप्लिकेशन को तोड़ दिया क्योंकि मैं डिफ़ॉल्ट रूप से सक्षम नया, अन-सिद्ध, प्रदर्शन अपमानजनक कार्यक्षमता जिसकी मुझे आवश्यकता नहीं थी, मैं एक के लिए बहुत दुखी होऊंगा। (उस ने कहा, यह अब मेरे "हमेशा एक नया आवेदन" चेकलिस्ट बनाते समय "पर एक नई प्रविष्टि है)।
शोर्न

0

हमारे लिए, हम इसी तरह के मुद्दे का सामना कर रहे थे। हमारा एप्लिकेशन मल्टीपल स्कीमा पर काम करता है। जब भी हम स्कीमा परिवर्तन कर रहे थे, इस मुद्दे को कम करना शुरू कर दिया।

जेडटीबीसी पैरामीटर के अंदर तैयारी थ्रेसहोल्ड = 0 पैरामीटर सेट करना डेटाबेस स्तर पर स्टेटमेंट कैशिंग को अक्षम करता है। इसने इसे हमारे लिए हल कर दिया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.