ऐसा लगता है कि यह स्प्रिंग "बग" और ड्राइवर "बग" का संयोजन है।
स्प्रिंग हर बार एक कॉलम के डेटा प्रकार को निर्धारित करने का प्रयास करता है setValue()
कहा जाता है। यह PreparedStatementMetaData.getParameterMetaData()
. पर कॉल करके ऐसा करता है
यह स्पष्ट रूप से डेटाबेस को "तैयार" कथन भेजने का कारण बनता है जो अपने आप में काफी तेज़ है (मेरे लैपटॉप पर 1ms से अधिक नहीं) लेकिन जैसा कि प्रत्येक कॉलम के लिए कहा जाता है प्रत्येक पंक्ति के लिए यह बहुत समय तक का योग करता है (इसे प्रत्येक शून्य-शून्य मान के लिए कहा जाता है जिसके परिणामस्वरूप लगभग 23.000 कॉल होते हैं)
कुछ हद तक यह एक स्प्रिंग बग तो एक ड्राइवर बग है क्योंकि पैरामीटर मेटा डेटा को कैशिंग नहीं करना वास्तव में समझ में नहीं आता है (कम से कम मेरी राय में)। MySQL JDBC ड्राइवर getParameterMetaData()
. का समर्थन नहीं करता है और वसंत यह जानता है और इसलिए यह "बग" MySQL के साथ दिखाई नहीं देता है क्योंकि वसंत कभी भी उस विधि को कॉल नहीं करता है।
मुझे यकीन नहीं है कि पोस्टग्रेज के JDBC ड्राइवर व्यवहार को बग के रूप में वर्गीकृत किया जा सकता है, लेकिन यह निश्चित रूप से अच्छा होगा यदि ड्राइवर पहली कॉल के बाद उस मेटा डेटा को कैशिंग कर रहा था।
स्प्रिंग को spring.jdbc.getParameterType.ignore
प्रॉपर्टी के माध्यम से स्टेटमेंट मेटा डेटा प्राप्त नहीं करने के लिए आश्वस्त किया जा सकता है
तो डाल कर:
System.setProperty("spring.jdbc.getParameterType.ignore", "true");
पहले लाइन:
LetsGo letsGo = new LetsGo();
यह व्यवहार अक्षम है।
प्रॉपर्टी को पहले . सेट किया जाना चाहिए वसंत शुरू हो गया है।
जब मैं आपके सैंपल प्रोजेक्ट के साथ ऐसा करता हूं, तो इंसर्ट मेरे लैपटॉप पर 500ms में चलता है।
संपादित करें
Postgres-NG ड्राइवर के उपयोग के बारे में टिप्पणी देखने के बाद मैंने "आधिकारिक" ड्राइवर और NG ड्राइवर के स्रोतों में खोदा, और NG ड्राइवर पहली कॉल के बाद पैरामीटर मेटा डेटा को कैश करता है जबकि आधिकारिक ड्राइवर ऐसा नहीं करता है बताते हैं कि एनजी ड्राइवर का उपयोग करना इतना तेज़ क्यों है (वसंत में कॉल को अक्षम किए बिना)