PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

प्रोग्रामेटिक रूप से पोस्टग्रेज JDBC के लिए एक `डेटासोर्स` ऑब्जेक्ट तैयार करें

tl;डॉ

PGSimpleDataSource jdbc.postgresql.org से JDBC ड्राइवर के साथ बंडल किया गया वर्ग DataSource लागू करता है इंटरफेस। अपने डेटाबेस कनेक्शन विवरण को PGSimpleDataSource . में कॉन्फ़िगर करें ऑब्जेक्ट, और एक DataSource . के रूप में पास करें वस्तु।

PGSimpleDataSource ds = new PGSimpleDataSource() ;  
ds.setServerName( "localhost" );  
ds.setDatabaseName( "your_db_name_here" );   
ds.setUser( "scott" );       
ds.setPassword( "tiger" );   

आवश्यकतानुसार डेटाबेस से कनेक्शन बनाने के लिए उस ऑब्जेक्ट का उपयोग करें। सुविधाजनक कोशिश-के-संसाधन सिंटैक्स का उपयोग करें।

try
(
    Connection conn = ds.getConnection() ;
) 
{ … }

JDBC ड्राइवर का क्रियान्वयन

आपका JDBC ड्राइवर आपको DataSource . का कार्यान्वयन प्रदान कर सकता है इंटरफ़ेस।

इस कार्यान्वयन के एक ऑब्जेक्ट में डेटाबेस से कनेक्शन बनाने और कॉन्फ़िगर करने के लिए आवश्यक जानकारी होती है, जैसे:

  • डेटाबेस उपयोगकर्ता का नाम और पासवर्ड
  • डेटाबेस सर्वर का आईपी पता और पोर्ट नंबर

प्रदान किए गए तीन प्रकार के कार्यान्वयन उपलब्ध हो सकते हैं:

  • अक्सर ऐसा कार्यान्वयन DriverManager . के चारों ओर एक पतला आवरण होता है . हर बार जब आप DataSource::getConnection . पर कॉल करते हैं इस तरह के कार्यान्वयन के उद्देश्य से, आपको एक नया डेटाबेस कनेक्शन मिलता है।
  • वैकल्पिक रूप से, एक कार्यान्वयन पहले से मौजूद कनेक्शन की आपूर्ति के लिए नीचे एक कनेक्शन पूल का उपयोग कर सकता है। ये कनेक्शन सौंपे जाते हैं और पुन:चेक इन किए जाते हैं, जैसे किसी पुस्तकालय में पुस्तकों को, बार-बार उपयोग के लिए पुनर्चक्रित करने के लिए।
  • एक कार्यान्वयन जावा ट्रांजेक्शन एपीआई का समर्थन कर सकता है, जो एक्स/ओपन एक्सए का समर्थन करता है, परिष्कृत जरूरतों के लिए जैसे कि डेटाबेस और संदेश कतार जैसे कई संसाधनों में लेनदेन का समन्वय करना। आमतौर पर इस्तेमाल नहीं किया जाता है, इसलिए मैं यहां इस प्रकार की उपेक्षा करता हूं।

jdbc.postgresql.org से ड्राइवर

jdbc.postgresql.org का ओपन-सोर्स फ्री-ऑफ-कॉस्ट ड्राइवर सभी तीन प्रकार के DataSource प्रदान करता है। कार्यान्वयन। लेकिन लेखक वास्तव में उत्पादन में अपने कनेक्शन पूल प्रकार का उपयोग करने की अनुशंसा नहीं करते हैं; यदि आप पूलिंग चाहते हैं, तो किसी तृतीय-पक्ष कनेक्शन पूलिंग लाइब्रेरी का उपयोग करें। और हम XA प्रकार की उपेक्षा कर रहे हैं।

तो आइए DataSource . के सरल ताज़ा-कनेक्शन-हर-बार कार्यान्वयन को देखें :org.postgresql.ds.PGSimpleDataSource

डेटा स्रोत ऑब्जेक्ट को कॉन्फ़िगर करना

एक खाली वस्तु को तुरंत चालू करें, फिर अपने विशेष डेटाबेस परिदृश्य के लिए कॉन्फ़िगर करने के लिए सेटर विधियों की एक श्रृंखला को कॉल करें। सेटर विधियां org.postgresql.ds.common.BaseDataSource से इनहेरिट की गई हैं ।

हम अभी तक इंटरफ़ेस DataSource . पर अपडेट नहीं कर रहे हैं , ताकि हम विभिन्न सेटर विधियों को कॉल कर सकें। डेटा स्रोत और JNDI पृष्ठ पर उदाहरण कोड और चर्चा देखें।

PGSimpleDataSource ds = new PGSimpleDataSource() ;  // Empty instance.
ds.setServerName( "localhost" );  // The value `localhost` means the Postgres cluster running locally on the same machine.
ds.setDatabaseName( "testdb" );   // A connection to Postgres must be made to a specific database rather than to the server as a whole. You likely have an initial database created named `public`.
ds.setUser( "testuser" );         // Or use the super-user 'postgres' for user name if you installed Postgres with defaults and have not yet created user(s) for your application.
ds.setPassword( "password" );     // You would not really use 'password' as a password, would you?

आम तौर पर मैं इन अलग सेटर विधियों का उपयोग करता हूं। वैकल्पिक रूप से, आप DataSource पर सेट की जाने वाली जानकारी के विभिन्न टुकड़ों के साथ एक स्ट्रिंग, एक URL का निर्माण करते हैं एक झटके में। अगर आप उस रास्ते पर जाना चाहते हैं, तो setUrl . पर कॉल करें ।

इसमें मूल बातें शामिल हैं। लेकिन आप कुछ अन्य सेटर्स चाहते हैं या चाहते हैं। इनमें से अधिकांश सर्वर पर पोस्टग्रेज प्रॉपर्टी वैल्यू सेट कर रहे हैं। सभी गुणों में स्मार्ट डिफ़ॉल्ट होते हैं, लेकिन आप विशेष परिस्थितियों के लिए ओवरराइड करना चाह सकते हैं।

ds.setPortNumber( 6787 ) ;  // If not using the default '5432'.
ds.setApplicationName( "whatever" ) ;   // Identify the application making this connection to the database. Also a clever way to back-door some information to the Postgres server, as you can encode small values into this string for later parsing. 
ds.setConnectTimeout( … ) ;  // The timeout value used for socket connect operations, in whole seconds. If connecting to the server takes longer than this value, the connection is broken.
ds.setSocketTimeout( … ) ;  // The timeout value used for socket read operations. If reading from the server takes longer than this value, the connection is closed. This can be used as both a brute force global query timeout and a method of detecting network problems.
ds.setReadOnly( boolean ) ;  // Puts this connection in read-only mode.

यदि टीएलएस (पूर्व में एसएसएल के रूप में जाना जाता है) का उपयोग ईव्सड्रॉपिंग या द्वेषपूर्ण हेरफेर से बचाने के लिए डेटाबेस कनेक्शन को एन्क्रिप्ट करने के लिए कर रहे हैं, तो उसके लिए कई सेटर्स का उपयोग करें।

किसी विशिष्ट सेटर विधि के बिना किसी भी पोस्टग्रेस संपत्ति के लिए, आप setProperty( PGProperty property, String value ) पर कॉल कर सकते हैं ।

आप कई गेट्टर विधियों में से किसी को भी कॉल करके इस डेटा स्रोत पर सेटिंग्स का निरीक्षण या सत्यापन कर सकते हैं।

अपना PGSimpleDataSource कॉन्फ़िगर करने के बाद , आप अपने शेष कोडबेस को केवल DataSource . के रूप में भेज सकते हैं वस्तु। यह आपके कोडबेस को दूसरे DataSource . में बदलने के झटके से बचाता है कार्यान्वयन या किसी अन्य JDBC ड्राइवर को बदलना।

DataSource dataSource = ds ;  // Upcasting from concrete class to interface.
return dataSource ; 

डेटा स्रोत का उपयोग करना

DataSource का उपयोग करना बिल्कुल सरल है क्योंकि यह केवल दो विधियों के लिए प्रदान करता है, getConnection . पर विविधताओं की एक जोड़ी एक Connection प्राप्त करने के लिए आपके डेटाबेस कार्य के लिए ऑब्जेक्ट।

Connection conn = dataSource.getConnection() ; 

आपके Connection . के साथ समाप्त होने पर , इसे बंद करना सुनिश्चित करना सर्वोत्तम अभ्यास है। या तो कनेक्शन को स्वचालित रूप से बंद करने के लिए संसाधनों के साथ प्रयास करें सिंटैक्स का उपयोग करें, या इसे स्पष्ट रूप से बंद करें।

conn.close() ;

अपने दिमाग में स्पष्ट रखें कि एक DataSource वास्तव में डेटा स्रोत नहीं है। एक DataSource वास्तव में डेटाबेस से कनेक्शन बनाने/पहुंचने का एक स्रोत है। मेरे विचार से, यह एक मिथ्या नाम है, जैसा कि मैं इसे ConnectionSource . के रूप में समझता हूं . DataSource उपयोगकर्ता नाम और पासवर्ड के साथ साइन-इन करने के लिए केवल आपके डेटाबेस से काफी देर तक बात करता है। उस साइन-इन के बाद, आप Connection . का उपयोग करते हैं डेटाबेस के साथ बातचीत करने के लिए आपत्ति।

अपना DataSource स्टोर करना

एक बार कॉन्फ़िगर करने के बाद, आप उस DataSource को रखना चाहते हैं चारों ओर वस्तु, कैश्ड। बार-बार पुन:कॉन्फ़िगर करने की आवश्यकता नहीं है। कार्यान्वयन को थ्रेड-सुरक्षित होने के लिए लिखा जाना चाहिए। आप getConnection . पर कॉल कर सकते हैं कभी भी कहीं से भी।

एक साधारण छोटे जावा ऐप के लिए, आप इसे एक सिंगलटन पर या एक स्थिर वैश्विक चर में एक फ़ील्ड के रूप में संग्रहीत करना चाह सकते हैं।

सर्वलेट-आधारित ऐप जैसे वाडिन . के लिए ऐप में, आप ServletContextListener implementing को लागू करने वाला एक वर्ग तैयार करेंगे इंटरफेस। उस कक्षा में आप अपना DataSource स्थापित करेंगे ऑब्जेक्ट जब आपका वेब ऐप लॉन्च हो रहा हो। वहां से आप ऑब्जेक्ट को ServletContext . में स्टोर करेंगे setAttribute . पर जाकर ऑब्जेक्ट करें . Context 'वेब ऐप' के लिए तकनीकी शब्द है। getAttribute . पर कॉल करके पुनर्प्राप्त करें और DataSource . पर कास्ट करना ।

एंटरप्राइज़ परिदृश्य में, DataSource एक जेएनडीआई-अनुपालन कार्यान्वयन में संग्रहीत किया जा सकता है। अपाचे टॉमकैट जैसे कुछ सर्वलेट कंटेनर जेएनडीआई कार्यान्वयन प्रदान कर सकते हैं। कुछ संगठन LDAP सर्वर जैसे सर्वर का उपयोग करते हैं। अपना DataSource पंजीकृत करना और पुनर्प्राप्त करना जेएनडीआई के साथ ऑब्जेक्ट स्टैक ओवरफ्लो पर कई अन्य प्रश्नों और उत्तरों में शामिल है।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. pg_table_size, pg_relation_size और pg_total_relation_size में क्या अंतर है? (पोस्टग्रेएसक्यूएल)

  2. डेटाबेस में तैयार विवरण सम्मिलित करना - PSQL

  3. डालने पर त्रुटि पोस्ट करता है - त्रुटि:UTF8 एन्कोडिंग के लिए अमान्य बाइट अनुक्रम:0x00

  4. मैं PostgreSQL में अस्थायी रूप से ट्रिगर्स को कैसे अक्षम कर सकता हूं?

  5. अजीब SQLAlchemy त्रुटि संदेश:लेखन त्रुटि:'तानाशाह' वस्तु अनुक्रमण का समर्थन नहीं करता