H2 डेटाबेस - प्रोटोटाइपिंग

लेखक
Damian
Terlecki
8 मिनट पढ़ें
डेटाबेस

डेटा लेयर आमतौर पर एप्लिकेशन आर्किटेक्चर का एक मुख्य तत्व होता है। न केवल डेवलपमेंट के दौरान, जब कुछ सैंपल और टेस्ट केस बनाते हैं, तो आपको कुछ हल्के-फुल्के की जरूरत महसूस हो सकती है। कुछ मामलों में, डेटाबेस के लिए एकमात्र आवश्यकता यह होती है कि इसे जल्दी से सेट किया जा सके और बिना ज्यादा काम या सोचे-समझे चलाया जा सके। अक्सर, आपको डेटा तक पहुंचने के लिए किसी भी प्रकार के कंसोल एप्लिकेशन की भी आवश्यकता नहीं होती है। यह आमतौर पर तब होता है जब कुछ स्वचालित/एकीकरण परीक्षण निष्पादित करते हैं। हालाँकि, डेटा मॉडल प्रोटोटाइपिंग (JPA डेटाबेस इनिशियलाइज़ेशन) या डेटाबेस कॉलम पर आधारित परीक्षण निर्माण के दौरान, मुझे यह देखना वास्तव में पसंद है कि अंदर क्या है।

शुरुआत में मैं MySQL या Oracle DB जैसे स्टैंडअलोन डेटाबेस का उपयोग कर रहा था। उन्हें हर बार किसी नए वातावरण पर सेट करना या किसी और से ऐसा करने के लिए कहना बहुत सुखद नहीं था। बाद में, Docker के बारे में सुनने पर मैं तुरंत उस पर स्विच कर गया। यह कुछ हद तक एक आशीर्वाद जैसा था। हालाँकि, बाद में मुझे एहसास हुआ, कि जब मैं कुछ छोटे मामले (अभी तक प्रोडक्शन-रेडी नहीं) प्रोजेक्ट या डेमो सैंपल कर रहा हूँ तो मुझे इतने ओवरहेड की वास्तव में आवश्यकता नहीं है। उस समय से मैं HSQLDB, Apache Derby, SQLite और H2 डेटाबेस जैसे विभिन्न इन-मेमोरी डेटाबेस का उपयोग कर रहा हूँ।

हाल ही में मुझे पता चला कि H2 डेटाबेस में प्रोटोटाइपिंग और टेस्टिंग के लिए वह सब कुछ है जिसकी मुझे आवश्यकता है। मैं इसे स्प्रिंग बूट के साथ लगभग तुरंत सेट कर सकता हूँ, pom फ़ाइल में एक निर्भरता जोड़कर:

<dependency>
    <groupId>com.h2database</groupId>
    <artifactId>h2</artifactId>
    <version>1.4.194</version>
</dependency>

मैं अपनी आवश्यकता के आधार पर स्कोप का चयन करता हूँ। Compile - यदि मैं लाइब्रेरी से कुछ अतिरिक्त टूल का उपयोग करना चाहता हूँ। Runtime - एप्लिकेशन के सामान्य उपयोग (प्रोटोटाइपिंग) के लिए। अंत में, test - एकीकरण परीक्षण चलाने के लिए। यह मुझे सहजता का एहसास देता है। मुझे डेटाबेस को शुरू करने और कॉन्फ़िगर करने के बारे में सोचने की ज़रूरत नहीं है - कम से कम इस बिंदु पर - क्योंकि स्प्रिंग बूट इसका ध्यान रखता है (JPA स्टार्टर)।

कंसोल और इन-मेमोरी मोड

H2 कंसोल लॉगिन

इसके अलावा, H2 एक वेब सर्वर कंसोल के साथ आता है। स्प्रिंग बूट (वेब और JPA स्टार्टर्स) का उपयोग करके आप इसे अपनी application.properties में spring.h2.console.enabled=true जोड़कर सक्षम कर सकते हैं। वेब कंसोल डिफ़ॉल्ट पोर्ट पर 'h2-console' पथ के तहत शुरू होगा, जैसे http://localhost:8080/h2-console। यह मानते हुए कि आपके पास अपनी एंटिटी कक्षाएं तैयार हैं, आप उनकी तालिकाओं को डिफ़ॉल्ट मेमोरी db इंस्टेंस jdbc:h2:mem:testdb में स्वतः प्रारंभ होते देखेंगे।

H2 कंसोल

स्प्रिंग बूट का उपयोग नहीं कर रहे हैं? कोई चिंता नहीं, सर्वर शुरू करना org.h2.tools.Server.main() को निष्पादित करने जितना आसान है। एक सर्वलेट संदर्भ में org.h2.server.web.DbStarter भी काम आ सकता है। गहन व्याख्या के लिए कृपया दस्तावेज़ीकरण देखें। एक उन्नत अनुभाग भी है जिसमें अन्य फ्रेमवर्क/भाषाओं (.NET) में डेटाबेस का उपयोग करने के बारे में जानकारी है। मानक जावा में वेब सर्वर स्टार्ट के साथ डेटाबेस से एक मैनुअल कनेक्शन निम्नलिखित कोड के साथ किया जा सकता है:

Connection connection = DriverManager.getConnection("jdbc:h2:mem:testdb", "sa", "");
Statement statement = connection.createStatement();
if(statement.execute("Select * from dual")) {
    System.out.println("Successfully connected to the jdbc:h2:mem:testdb");
}
Server.startWebServer(connection);

इसे भी आपके वेब ब्राउज़र में कुछ रैंडम पोर्ट पर कंसोल शुरू और खोलना चाहिए।

सर्वर मोड

अगला उपयोगी मामला जिस पर आप विचार कर सकते हैं, वह है एप्लिकेशन के बाहर से, एक अलग प्रक्रिया/होस्ट से डेटाबेस से कनेक्ट करना। यह आमतौर पर थोड़ा कठिन होता है क्योंकि डेटाबेस इन-मेमोरी चल रहा होता है। डिफ़ॉल्ट रूप से, db को एक ही वर्चुअल मशीन और क्लास लोडर के भीतर एक्सेस किया जा सकता है। हालाँकि, H2 टूल्स की बदौलत इसे TCP सर्वर का उपयोग करके एक्सपोज़ करना भी संभव है। स्प्रिंग में एक अनुकरणीय बीन, जो सर्वर बनाने, शुरू करने और रोकने के लिए जिम्मेदार है, को इस प्रकार परिभाषित किया जा सकता है:

@Bean(initMethod = "start", destroyMethod = "stop")
public Server inMemoryH2DatabaseServer() throws SQLException {
    return Server.createTcpServer("-tcp", "-tcpAllowOthers", "-tcpPort", "9090");
}

अब डेटाबेस को 9090 पोर्ट पर, jdbc ड्राइवर (org.h2.Driver) का उपयोग करके jdbc:h2:tcp://localhost:9090/mem:testdb पथ पर एक्सेस किया जा सकता है। इसके साथ एक अलग एप्लिकेशन से डेटाबेस से कनेक्ट करना संभव है, उदाहरण के लिए JMeter से, डेटा को सत्यापित करने या लोड परीक्षण चलाने के लिए। org.h2.tools.Server क्लास का उपयोग करने के लिए, आपको H2 निर्भरता को compile (डिफ़ॉल्ट) स्कोप के साथ जोड़ना होगा। इसे सर्वर मोड कहा जाता है।

एम्बेडेड मोड

अंत में, H2 को एम्बेडेड मोड में चलाने के लिए कॉन्फ़िगर करना भी संभव है। इस तरह आपका डेटा एक फ़ाइल में रखा जाएगा और एप्लिकेशन रन के दौरान बना रहेगा। स्प्रिंग बूट में कॉन्फ़िगरेशन सीधा है - application.properties में डेटाबेस फ़ाइल के लिए पथ परिभाषित करें:

spring.datasource.url=jdbc:h2:./testdb
spring.jpa.hibernate.ddl-auto=update

हमें spring.jpa.hibernate.ddl-auto=update का उपयोग डिफ़ॉल्ट create-drop मान को ओवरराइट करने के लिए करना होगा। आप इन मोड को मिला भी सकते हैं और एक का उपयोग "प्रोडक्शन" के लिए और दूसरे का परीक्षण चलाने के लिए कर सकते हैं। यह test/resources डायरेक्टरी में एक अलग properties फ़ाइल बनाने जितना आसान है।

ध्यान दें कि, चाहे कोई भी दृष्टिकोण कितना भी अच्छा क्यों न लगे, यह हमेशा कुछ फायदे और नुकसान के साथ आता है, यही कारण है कि यह हमेशा एक व्यक्ति पर निर्भर करता है कि वह उपकरण चुने और तय करे कि बदले में क्या त्याग करना है (शायद कुछ भी नहीं, उपयोग के मामले पर निर्भर करता है)। चीयर्स!