जैसा कि दूसरों ने कहा है, आपका कोड मूल रूप से सही है, हालांकि बाहरी tryअनावश्यक है। यहाँ कुछ और विचार हैं।
DataSource
यहाँ अन्य उत्तर सही और अच्छे हैं, जैसे bpgergo द्वारा स्वीकृत उत्तर । लेकिन आधुनिक जावा में DataSourceआमतौर पर अनुशंसित शो का उपयोग नहीं किया जाता है DriverManager।
तो पूर्णता के लिए, यहां एक पूर्ण उदाहरण है जो डेटाबेस सर्वर से वर्तमान दिनांक को प्राप्त करता है। यहाँ उपयोग किया जाने वाला डेटाबेस पोस्टग्रेज है । कोई भी अन्य डेटाबेस इसी तरह काम करेगा। आप अपने डेटाबेस org.postgresql.ds.PGSimpleDataSourceमें DataSourceउपयुक्त के कार्यान्वयन के साथ उपयोग की जगह लेंगे । यदि आप उस मार्ग पर जाते हैं तो आपके विशेष ड्राइवर, या कनेक्शन पूल द्वारा एक कार्यान्वयन की संभावना प्रदान की जाती है।
एक DataSourceकार्यान्वयन की जरूरत नहीं , बंद कर दिया है क्योंकि यह "खोला" कभी नहीं किया गया है। A DataSourceसंसाधन नहीं है, डेटाबेस से जुड़ा नहीं है, इसलिए यह डेटाबेस सर्वर पर न तो नेटवर्किंग कनेक्शन और न ही संसाधन पकड़ रहा है। एक DataSourceबस की जरूरत है जब डेटाबेस से संबंध, डेटाबेस सर्वर के नेटवर्क नाम या पता, उपयोगकर्ता नाम, उपयोगकर्ता पासवर्ड, और विभिन्न विकल्पों आपके द्वारा निर्दिष्ट करना चाहते हैं जब एक कनेक्शन अंत में किया जाता है के साथ बनाने की जानकारी है। इसलिए आपका DataSourceकार्यान्वयन ऑब्जेक्ट आपके प्रयास के साथ संसाधन कोष्ठक के अंदर नहीं जाता है।
नेस्टेड कोशिश-के साथ संसाधनों
आपका कोड नेस्टेड-विथ-रिसोर्स स्टेटमेंट का उचित उपयोग करता है।
नीचे दिए गए उदाहरण कोड में ध्यान दें कि हम दो बार try-with-resource syntax का उपयोग करते हैं , एक दूसरे के अंदर नेस्टेड का। बाहरी tryदो संसाधनों को परिभाषित करता है: Connectionऔर PreparedStatement। आंतरिक संसाधन tryको परिभाषित करता है ResultSet। यह एक सामान्य कोड संरचना है।
यदि कोई अपवाद आंतरिक एक से फेंका गया है, और वहां नहीं पकड़ा गया है, तो ResultSetसंसाधन स्वचालित रूप से बंद हो जाएगा (यदि यह मौजूद है, तो अशक्त नहीं है)। उसके बाद, PreparedStatementवसीयत बंद हो जाती है, और अंत में Connectionबंद हो जाती है। संसाधनों को स्वचालित रूप से रिवर्स ऑर्डर में बंद कर दिया जाता है, जिसमें उन्हें प्रयास-संसाधन विवरणों के भीतर घोषित किया गया था।
यहाँ उदाहरण कोड अत्यधिक सरलीकृत है। जैसा कि लिखा गया है, इसे एकल-प्रयास-संसाधन विवरण के साथ निष्पादित किया जा सकता है। लेकिन वास्तविक काम में आप संभवत: नेस्टेड tryकॉल के बीच अधिक काम कर रहे हैं। उदाहरण के लिए, आप अपने उपयोगकर्ता-इंटरफ़ेस या POJO से मान निकाल सकते हैं, और फिर ?कॉल के माध्यम से अपने SQL में प्लेसहोल्डर्स को पूरा करने के लिए उन PreparedStatement::set…तरीकों से गुजर रहे हैं ।
सिंटेक्स नोट्स
अनुगामी अर्धविराम
ध्यान दें कि कोशिश-के-संसाधनों के कोष्ठक के भीतर अंतिम संसाधन विवरण को भरने वाला अर्धविराम वैकल्पिक है। मैं इसे दो कारणों से अपने काम में शामिल करता हूं: संगति और यह पूर्ण दिखता है, और यह एंड-ऑफ-लाइन अर्धविरामों के बारे में चिंता किए बिना लाइनों के मिश्रण को कॉपी-पेस्ट करना आसान बनाता है। आपका आईडीई अंतिम अर्धविराम को बहुत ही कम कर सकता है, लेकिन इसे छोड़ने में कोई बुराई नहीं है।
जावा 9 - कोशिश में संसाधनों के साथ मौजूदा संस्करणों का उपयोग करें
जावा 9 में नया, संसाधनों के साथ-साथ वाक्य रचना के लिए एक वृद्धि है। अब हम tryबयान के कोष्ठकों के बाहर संसाधनों को घोषित और आबाद कर सकते हैं । मैंने अभी तक जेडीबीसी संसाधनों के लिए इसे उपयोगी नहीं पाया है, लेकिन इसे अपने काम में ध्यान में रखें।
ResultSet खुद को बंद करना चाहिए, लेकिन नहीं हो सकता है
एक आदर्श दुनिया ResultSetमें प्रलेखन वादे के रूप में खुद को बंद कर देगा:
जब रिजल्ट जेनरेट होता है, तो रिजल्टसेट ऑब्जेक्ट स्वचालित रूप से बंद हो जाता है, इसे बंद किया जाता है, फिर से निष्पादित किया जाता है, या कई परिणामों के अनुक्रम से अगला परिणाम प्राप्त करने के लिए उपयोग किया जाता है।
दुर्भाग्य से, अतीत में कुछ JDBC ड्राइवर बदनाम हुए थे और इस वादे को पूरा करने में विफल रहे। परिणामस्वरूप, कई JDBC प्रोग्रामर ने स्पष्ट रूप से अपने सभी JDBC संसाधनों को बंद करना सीख लिया Connection, जिनमें शामिल हैं PreparedStatement, और ResultSetभी। आधुनिक कोशिश-के साथ संसाधनों के सिंटैक्स ने ऐसा करना आसान बना दिया है, और अधिक कॉम्पैक्ट कोड के साथ। ध्यान दें कि जावा टीम के ResultSetरूप में चिह्नित करने की परेशान करने के लिए चला गया AutoCloseable, और मेरा सुझाव है कि हम उस का उपयोग करें। अपने सभी JDBC संसाधनों के आसपास एक कोशिश के साथ संसाधनों का उपयोग करना आपके इरादों के अनुसार आपके कोड को अधिक स्व-दस्तावेजीकरण बनाता है।
कोड उदाहरण
package work.basil.example;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.util.Objects;
public class App
{
public static void main ( String[] args )
{
App app = new App();
app.doIt();
}
private void doIt ( )
{
System.out.println( "Hello World!" );
org.postgresql.ds.PGSimpleDataSource dataSource = new org.postgresql.ds.PGSimpleDataSource();
dataSource.setServerName( "1.2.3.4" );
dataSource.setPortNumber( 5432 );
dataSource.setDatabaseName( "example_db_" );
dataSource.setUser( "scott" );
dataSource.setPassword( "tiger" );
dataSource.setApplicationName( "ExampleApp" );
System.out.println( "INFO - Attempting to connect to database: " );
if ( Objects.nonNull( dataSource ) )
{
String sql = "SELECT CURRENT_DATE ;";
try (
Connection conn = dataSource.getConnection() ;
PreparedStatement ps = conn.prepareStatement( sql ) ;
)
{
… make `PreparedStatement::set…` calls here.
try (
ResultSet rs = ps.executeQuery() ;
)
{
if ( rs.next() )
{
LocalDate ld = rs.getObject( 1 , LocalDate.class );
System.out.println( "INFO - date is " + ld );
}
}
}
catch ( SQLException e )
{
e.printStackTrace();
}
}
System.out.println( "INFO - all done." );
}
}
try (ResultSet rs = ps.executeQuery()) {क्योंकि A ResultSet ऑब्जेक्ट स्वचालित रूप से स्टेटमेंट ऑब्जेक्ट द्वारा इसे बंद कर दिया गया है