जैसा कि दूसरों ने कहा है, आपका कोड मूल रूप से सही है, हालांकि बाहरी 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 ऑब्जेक्ट स्वचालित रूप से स्टेटमेंट ऑब्जेक्ट द्वारा इसे बंद कर दिया गया है