( इन-मेमोरी पोस्टग्रेक्यूएल का उपयोग करने और इसे सामान्य करने से मेरा जवाब हिलाना ):
आप Pg इन-प्रोसेस, इन-मेमोरी नहीं चला सकते
मैं यह नहीं पता लगा सकता कि परीक्षण के लिए इन-मेमोरी पोस्टग्रेज डेटाबेस को कैसे चलाया जाए। क्या यह संभव है?
नहीं, यह संभव नहीं है। PostgreSQL C में लागू किया गया है और प्लेटफ़ॉर्म कोड पर संकलित किया गया है। H2 या डर्बी के विपरीत आप बस लोड नहीं कर सकते हैं jarऔर इसे एक भड़काऊ इन-मेमोरी DB के रूप में आग लगा सकते हैं।
SQLite के विपरीत, जिसे C में भी लिखा गया है और प्लेटफ़ॉर्म कोड में संकलित किया गया है, PostgreSQL को प्रक्रिया में लोड नहीं किया जा सकता है। इसके लिए कई प्रक्रियाओं (एक प्रति कनेक्शन) की आवश्यकता होती है क्योंकि यह एक बहु-आयामी है, न कि एक मल्टीथ्रेडिंग, आर्किटेक्चर। मल्टीप्रोसेसिंग आवश्यकता का मतलब है कि आपको पोस्टमास्टर को एक स्टैंडअलोन प्रक्रिया के रूप में लॉन्च करना होगा ।
इसके बजाय: एक कनेक्शन पूर्व-कॉन्फ़िगर करें
मेरा सुझाव है कि काम करने के लिए किसी विशेष होस्टनाम / उपयोगकर्ता नाम / पासवर्ड की अपेक्षा करने के लिए बस अपने परीक्षण लिखना और परीक्षण CREATE DATABASEएक फेंकने योग्य डेटाबेस का उपयोग करना, फिर DROP DATABASEरन के अंत में। प्रॉपर्टी फ़ाइल से डेटाबेस कनेक्शन विवरण प्राप्त करें, लक्ष्य गुण, पर्यावरण चर आदि का निर्माण करें।
किसी मौजूदा PostgreSQL उदाहरण का उपयोग करना आपके लिए पहले से सुरक्षित डेटाबेस है, इसलिए जब तक आप अपने यूनिट परीक्षणों की आपूर्ति करने वाले उपयोगकर्ता के लिए सुपरसुअर नहीं है, केवल CREATEDBअधिकारों वाला उपयोगकर्ता है। सबसे कम आप अन्य डेटाबेस में प्रदर्शन समस्याएँ पैदा करेंगे। मैं उस कारण के परीक्षण के लिए एक पूरी तरह से पृथक PostgreSQL इंस्टॉल करना पसंद करता हूं।
इसके बजाय: परीक्षण के लिए एक भगोड़ा PostgreSQL उदाहरण लॉन्च करें
वैकल्पिक रूप से, यदि आप वास्तव में उत्सुक हैं तो आप अपने परीक्षण का उपयोगinitdbpostgresinitdbpg_hba.conftrustpostgres कर सकते हैं और बायनेरिज़ का पता लगा सकते हैं , डेटाबेस बनाने के लिए दौड़ सकते हैं, संशोधित कर सकते हैं , इसे यादृच्छिक पोर्ट पर शुरू कर सकते हैं, उपयोगकर्ता बना सकते हैं, डीबी बना सकते हैं और परीक्षण चला सकते हैं । तुम भी एक जार में कई आर्किटेक्चर के लिए PostgreSQL बायनेरिज़ को बंडल कर सकते हैं और परीक्षणों को चलाने से पहले एक अस्थायी निर्देशिका के लिए वर्तमान आर्किटेक्चर के लिए अनपैक कर सकते हैं।
व्यक्तिगत रूप से मुझे लगता है कि एक बड़ी पीड़ा है जिसे टाला जाना चाहिए; यह आसान है बस एक परीक्षण DB कॉन्फ़िगर किया गया है। हालांकि, इसमें include_dirसमर्थन के आगमन के साथ थोड़ा आसान हो गया है postgresql.conf; अब आप केवल एक पंक्ति को जोड़ सकते हैं, फिर बाकी सभी के लिए एक उत्पन्न विन्यास फाइल लिख सकते हैं।
PostgreSQL के साथ तेज़ परीक्षण
परीक्षण उद्देश्यों के लिए PostgreSQL के प्रदर्शन को सुरक्षित रूप से कैसे बेहतर बनाया जाए, इसके बारे में अधिक जानकारी के लिए, मैंने पहले इस विषय पर लिखा एक विस्तृत जवाब देखें: तेजी से परीक्षण के लिए PostgreSQL का अनुकूलन करें
H2 की PostgreSQL बोली एक सही विकल्प नहीं है
इसके बजाय कुछ लोग परीक्षण चलाने के लिए PostgreSQL बोली मोड में H2 डेटाबेस का उपयोग करते हैं। मुझे लगता है कि उत्पादन तैनाती के लिए परीक्षण और PostgreSQL के लिए SQLite का उपयोग करने वाले रेल के रूप में लगभग उतना ही बुरा है।
H2 कुछ PostgreSQL एक्सटेंशन का समर्थन करता है और PostgreSQL बोली का अनुकरण करता है। हालांकि, यह सिर्फ एक अनुकरण है। आपको ऐसे क्षेत्र मिलेंगे जहां H2 एक क्वेरी स्वीकार करता है लेकिन PostgreSQL नहीं करता है, जहां व्यवहार भिन्न होता है, आदि । आपको बहुत सारे स्थान मिलेंगे जहाँ PostgreSQL कुछ ऐसा करने का समर्थन करता है जो लिखने के समय H2 बस नहीं कर सकता है - जैसे विंडो फ़ंक्शंस।
यदि आप इस दृष्टिकोण की सीमाओं को समझते हैं और आपके डेटाबेस की पहुंच सरल है, तो H2 ठीक हो सकता है। लेकिन उस मामले में आप शायद ORM के लिए एक बेहतर उम्मीदवार हैं जो डेटाबेस को सार करता है क्योंकि आप वैसे भी इसकी दिलचस्प विशेषताओं का उपयोग नहीं कर रहे हैं - और उस स्थिति में, आपको डेटाबेस संगतता के बारे में अधिक ध्यान रखने की आवश्यकता नहीं है।
Tablespaces का जवाब नहीं!
है न एक "में स्मृति" डेटाबेस बनाने के लिए एक टेबल-स्पेस का उपयोग करें। न केवल यह अनावश्यक है, क्योंकि यह प्रदर्शन को काफी मदद नहीं करेगा, बल्कि यह किसी भी अन्य के लिए उपयोग को बाधित करने का एक शानदार तरीका है जिसे आप उसी पोस्टग्रेक्यूएल इंस्टॉल में देख सकते हैं। 9.4 प्रलेखन में अब निम्नलिखित चेतावनी शामिल है :
चेतावनी
भले ही मुख्य PostgreSQL डेटा निर्देशिका के बाहर स्थित है, टेबलस्पेस डेटाबेस क्लस्टर का एक अभिन्न अंग हैं और डेटा फ़ाइलों के स्वायत्त संग्रह के रूप में नहीं माना जा सकता है। वे मुख्य डेटा निर्देशिका में निहित मेटाडेटा पर निर्भर हैं, और इसलिए एक अलग डेटाबेस क्लस्टर से जुड़ा नहीं जा सकता है या व्यक्तिगत रूप से समर्थित नहीं हो सकता है। इसी तरह, यदि आप एक टेबलस्पेस (फ़ाइल विलोपन, डिस्क विफलता, आदि) खो देते हैं, तो डेटाबेस क्लस्टर अपठनीय या प्रारंभ करने में असमर्थ हो सकता है। अस्थायी फ़ाइल सिस्टम पर एक टेम्पेस्पेस रखने की तरह एक रैमडिस्क पूरे क्लस्टर की विश्वसनीयता को जोखिम में डालता है।
क्योंकि मैंने देखा कि बहुत से लोग ऐसा कर रहे थे और मुसीबत में चल रहे थे।
(यदि आपने ऐसा कर लिया है तो आप mkdirफिर से शुरू करने के लिए PostgreSQL प्राप्त करने के लिए लापता टेबलस्पेस निर्देशिका कर सकते हैं , फिर DROPलापता डेटाबेस, टेबल आदि। यह सिर्फ ऐसा नहीं करना बेहतर है।)