एक DataSource
प्राप्त करना कार्यान्वयन
आमतौर पर आपका JDBC ड्राइवर
javax.sql.DataSource
।
अधिक जानकारी के लिए, देखें my Answer इसी तरह के प्रश्न के लिए।
PGSimpleDataSource
अगर jdbc.postgresql.org
से JDBC ड्राइवर का इस्तेमाल कर रहे हैं , आप org.postgresql.ds.PGSimpleDataSource
आपके DataSource
. के रूप में वर्ग कार्यान्वयन।
PGSimpleDataSource
. प्रकार के ऑब्जेक्ट को इंस्टेंट करें , फिर अपने डेटाबेस सर्वर से कनेक्ट करने के लिए आवश्यक सभी जानकारी प्रदान करने के लिए सेटर विधियों को कॉल करें। DigitalOcean साइट पर वेब पेज आपके विशेष डेटाबेस उदाहरण के लिए इन सभी जानकारी को सूचीबद्ध करता है।
मूल रूप से यह:
PGSimpleDataSource dataSource = new PGSimpleDataSource();
dataSource.setServerName( "your-server-address-goes-here" );
dataSource.setPortNumber( your-port-number-goes-here );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
बहुवचन सर्वर नाम और पोर्ट नंबर
दुर्भाग्य से, विधियों का एकवचन संस्करण setServerName
और setPortNumber
पदावनत हैं। कष्टप्रद होने पर, हमें शायद उन विधियों के बहुवचन संस्करण का उपयोग करना चाहिए (setServerNames
&setPortNumbers
) कि प्रत्येक एक सरणी लेता है। हम एकल-तत्व सरणियों की एक जोड़ी को पॉप्युलेट करते हैं, String[]
और int[]
, हमारे सर्वर के पते और पोर्ट नंबर
के साथ सरणी अक्षर का उपयोग करना:
- { "your-server-address-goes-here" }
- { your-port-number-goes-here }
PGSimpleDataSource dataSource = new PGSimpleDataSource();
String[] serverAddresses = { "your-server-address-goes-here" };
dataSource.setServerNames( serverAddresses );
int[] serverPortNumbers = { your-port-number-goes-here };
dataSource.setPortNumbers( serverPortNumbers );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
एसएसएल/टीएलएस एन्क्रिप्शन
अंत में हमें प्रश्न में संबोधित एसएसएल/टीएलएस एन्क्रिप्शन के लिए जानकारी जोड़ने की जरूरत है।
विडंबना यह है कि नहीं करें setSsl( true )
. पर कॉल करें
आपको लगता होगा कि हम setSsl
विधि और पास true
. लेकिन नहीं। प्रति-सहज ज्ञान युक्त होने पर, इसे सही पर सेट करने से आपके कनेक्शन के प्रयास विफल हो जाएंगे। मुझे नहीं पता कि ऐसा क्यों है। लेकिन परीक्षण-और-त्रुटि ने मुझे उस कॉल से बचने के लिए प्रेरित किया।
CA प्रमाणपत्र
आपके क्लाइंट-साइड जावा ऐप के लिए SSL/TLS कनेक्शन आरंभ करने के लिए, JDBC ड्राइवर के पास CA प्रमाणपत्र तक पहुंच होनी चाहिए। डिजिटल महासागर द्वारा उपयोग किया जाता है। अपने डिजिटल ओशन एडमिन पेज पर, Download CA certificate
. पर क्लिक करें एक छोटी टेक्स्ट फ़ाइल डाउनलोड करने के लिए लिंक। उस फ़ाइल का नाम होगा ca-certificate.crt
।
हमें उस फ़ाइल के टेक्स्ट को हमारे JDBC ड्राइवर को एक स्ट्रिंग के रूप में फीड करने की आवश्यकता है। फ़ाइल को टेक्स्ट स्ट्रिंग में लोड करने के लिए निम्न कार्य करें।
// Get CA certificate used in TLS connections.
Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
String cert = null;
try
{
cert = Files.readString( path , StandardCharsets.UTF_8 );
System.out.println( "cert = " + cert );
}
catch ( IOException ex )
{
throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
}
Objects.requireNonNull( cert );
if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
DataSource::setSslCert
. ध्यान दें कि हम नहीं हैं setSslRootCert
. समान नाम वाली दो विधियों को आपस में न मिलाएं।
dataSource.setSslCert( cert );
कनेक्शन का परीक्षण करना
अंत में, हम कॉन्फ़िगर किए गए DataSource
. का उपयोग कर सकते हैं डेटाबेस से संबंध बनाने के लिए आपत्ति। वह कोड इस तरह दिखेगा:
// Test connection
try (
Connection conn = dataSource.getConnection() ;
// …
)
{
System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
// …
}
catch ( SQLException e )
{
e.printStackTrace();
}
पूर्ण उदाहरण कोड
इन सबको मिलाकर, कुछ इस तरह देखें।
// Get CA certificate used in TLS connections.
Path path = Paths.get( "/Users/basilbourque/Downloads/ca-certificate.crt" );
String cert = null;
try
{
cert = Files.readString( path , StandardCharsets.UTF_8 );
System.out.println( "cert = " + cert );
}
catch ( IOException ex )
{
throw new IllegalStateException( "Unable to load the TLS certificate needed to make database connections." );
}
Objects.requireNonNull( cert );
if ( cert.isEmpty() ) {throw new IllegalStateException( "Failed to load TLS cert." ); }
// PGSimpleDataSource configuration
PGSimpleDataSource dataSource = new PGSimpleDataSource();
String[] serverAddresses = { "your-server-address-goes-here" };
dataSource.setServerNames( serverAddresses );
int[] serverPortNumbers = { your-port-number-goes-here };
dataSource.setPortNumbers( serverPortNumbers );
dataSource.setSslCert( cert );
dataSource.setDatabaseName( "defaultdb" );
dataSource.setUser( "doadmin" );
dataSource.setPassword( "your-password-goes-here" );
// Test connection
try (
Connection conn = dataSource.getConnection() ;
// …
)
{
System.out.println( "DEBUG - Postgres connection made. " + Instant.now() );
// …
}
catch ( SQLException e )
{
e.printStackTrace();
}
विश्वसनीय स्रोत
DigitalOcean.com पर अपना Postgres उदाहरण बनाते समय, आपको आने वाले कनेक्शन अनुरोधों को प्रतिबंधित करने की क्षमता की पेशकश की जाएगी। आप पोस्टग्रेज सर्वर द्वारा अपेक्षित एक एकल आईपी पता निर्दिष्ट कर सकते हैं, जो डिजिटल महासागर के लिंगो में एक "विश्वसनीय स्रोत" है। आपके Postgres सर्वर से कनेक्ट करने का प्रयास करने वाले किसी भी हैकर को अनदेखा कर दिया जाएगा क्योंकि वे अन्य IP पतों से उत्पन्न होते हैं।
युक्ति:वेब पेज को स्वचालित रूप से पहचानने और वर्तमान में आपके वेब ब्राउज़र द्वारा उपयोग किए जा रहे आईपी पते की पेशकश करने के लिए इस आईपी पता संख्या के लिए डेटा-एंट्री फ़ील्ड के अंदर क्लिक करें। यदि आप एक ही कंप्यूटर से अपना जावा कोड चला रहे हैं, तो उसी आईपी नंबर का उपयोग अपने एकल विश्वसनीय स्रोत के रूप में करें।
अन्यथा, अपना जावा JDBC कोड चलाने वाले कंप्यूटर का IP पता टाइप करें।
अन्य मुद्दे
मैंने आपकी सीए प्रमाणपत्र फ़ाइल को प्रबंधित करने के लिए उपयोग करने के लिए उचित सुरक्षा प्रोटोकॉल, या DataSource
प्राप्त करके आपकी कनेक्शन जानकारी को बाहरी बनाने जैसे विस्तारों को संबोधित नहीं किया है। एक JNDI
से ऑब्जेक्ट सर्वर के बजाय हार्ड-कोडिंग
. लेकिन उम्मीद है कि ऊपर दिए गए उदाहरण आपको आरंभ करने में मदद करेंगे।