অন্যরা যেমন বলেছে, আপনার কোডটি মূলত সঠিক যদিও try
বাইরেরটি অপ্রয়োজনীয়। এখানে আরও কয়েকটি চিন্তাভাবনা রয়েছে।
DataSource
এখানে অন্যান্য উত্তর সঠিক এবং ভাল, যেমন বিপিগারগো দ্বারা গৃহীত উত্তর । তবে শো-এর DataSource
কোনওটিই DriverManager
আধুনিক জাভাতে সাধারণত ব্যবহারের চেয়ে প্রস্তাবিত নয় ।
সুতরাং সম্পূর্ণতার জন্য, এখানে একটি সম্পূর্ণ উদাহরণ যা ডেটাবেস সার্ভার থেকে বর্তমান তারিখটি নিয়ে আসে। এখানে ব্যবহৃত ডাটাবেসটি পোস্টগ্রিস । অন্য কোনও ডাটাবেস একইভাবে কাজ করবে। আপনি আপনার ডাটাবেসে উপযুক্ত org.postgresql.ds.PGSimpleDataSource
প্রয়োগের ব্যবহারটি প্রতিস্থাপন করবেন DataSource
। কোনও বাস্তবায়ন সম্ভবত আপনার নির্দিষ্ট ড্রাইভার বা সংযোগ পুল দ্বারা সরবরাহ করা হয় যদি আপনি সেই পথে যান।
একটি DataSource
বাস্তবায়ন বন্ধ করা দরকার না , কারণ এটি কখনই "খোলা" হয় না। এ DataSource
কোনও সংস্থান নয়, এটি ডাটাবেসের সাথে সংযুক্ত নয়, সুতরাং এটি ডাটাবেস সার্ভারে নেটওয়ার্কিং সংযোগ বা সংস্থান রাখছে না। একটি DataSource
হ'ল ডাটাবেসটিতে সংযোগ করার সময় প্রয়োজনীয় তথ্য, ডাটাবেস সার্ভারের নেটওয়ার্ক নাম বা ঠিকানা, ব্যবহারকারীর নাম, ব্যবহারকারীর পাসওয়ার্ড এবং বিভিন্ন সংযোগের পরে আপনি সংযুক্ত হওয়ার পরে নির্দিষ্ট করতে চান। সুতরাং আপনার DataSource
বাস্তবায়নের অবজেক্টটি আপনার ব্যবহারের সাথে সংস্থানগুলির প্রথম বন্ধনীর ভিতরে চলে না ।
নেস্টেড চেষ্টা সঙ্গে সংস্থান
আপনার কোডটি নেস্টেড ট্রাই-উইথ রিসোর্সের বিবৃতিগুলির যথাযথ ব্যবহার করে।
নীচের উদাহরণ কোডটিতে লক্ষ্য করুন যে আমরা চেষ্টা-সহ-সংস্থানগুলি সিনট্যাক্সটিও দু'বার ব্যবহার করি , একজনের মধ্যে অন্যটির অভ্যন্তরে ested বাইরের try
দুটি সংস্থান সংজ্ঞা দেয়: Connection
এবং PreparedStatement
। অভ্যন্তরীণ সংস্থান try
সংজ্ঞা দেয় ResultSet
। এটি একটি সাধারণ কোড কাঠামো।
যদি অভ্যন্তরীণ থেকে কোনও ব্যতিক্রম ছুঁড়ে ফেলা হয় এবং সেখানে ধরা না পড়ে তবে উত্সটি ResultSet
স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে (যদি এটি উপস্থিত থাকে তবে নাল নয়)। এর পরে, PreparedStatement
বন্ধ হয়ে যাবে এবং শেষ অবধি এটি Connection
বন্ধ থাকবে। রিসোর্সগুলি বিপরীত ক্রমে স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় যেখানে তারা সংস্থান-সংস্থান-সংক্রান্ত বিবৃতিতে ঘোষিত হয়েছিল।
এখানে উদাহরণ কোড অত্যধিক সরল। লিখিত হিসাবে, এটি একক চেষ্টা-সংস্থান-সংক্রান্ত বিবৃতি দিয়ে কার্যকর করা যেতে পারে। তবে একটি আসল কাজে আপনি সম্ভবত নেস্টেড জোড় try
কলের মধ্যে আরও কাজ করছেন । উদাহরণস্বরূপ, আপনি আপনার ব্যবহারকারীর ইন্টারফেস বা কোনও পোজো থেকে মানগুলি বের করে আনতে পারেন এবং তারপরে পদ্ধতিগুলিতে ?
কলগুলির মাধ্যমে আপনার এসকিউএল এর মধ্যে স্থানধারকগুলি পূরণ করতে সেগুলি পাস করছেন PreparedStatement::set…
।
সিনট্যাক্স নোট
অর্ধকোলন ট্রেলিং
লক্ষ্য করুন যে-সংস্থানসমূহের চেষ্টা করে বন্ধুত্বের মধ্যে সর্বশেষ সংস্থান বিবরণীর পিছনে থাকা সেমিকোলনটি isচ্ছিক। আমি এটি দুটি কারণে আমার নিজের কাজে অন্তর্ভুক্ত করেছি: ধারাবাহিকতা এবং এটি সম্পূর্ণ দেখায় এবং লাইন-এর শেষ সেমিকোলনের বিষয়ে চিন্তা না করেই লাইনগুলির মিশ্রণটি অনুলিপি-পেস্ট করা সহজ করে দেয়। আপনার আইডিই সর্বশেষ সেমিকোলনকে অতিরিক্ত অতিরিক্ত হিসাবে চিহ্নিত করতে পারে তবে এটি ছেড়ে দেওয়ার কোনও ক্ষতি নেই harm
জাভা 9 - ব্যবহারের সাথে সংস্থানগুলিতে বিদ্যমান ভার্স ব্যবহার করুন
রিসোর্স সিনট্যাক্স চেষ্টা করে জাভা 9 -এ নতুন। আমরা এখন try
বিবৃতিটির প্রথম বন্ধনের বাইরে সংস্থানগুলি ঘোষণা করতে এবং পপুলেট করতে পারি । আমি জেডিবিসি সংস্থার জন্য এখনও এটি দরকারী খুঁজে পাই নি, তবে এটি আপনার নিজের কাজের ক্ষেত্রে মনে রাখবেন।
ResultSet
নিজেই বন্ধ করা উচিত, কিন্তু না
একটি আদর্শ বিশ্বে ResultSet
ডকুমেন্টেশন প্রতিশ্রুতি হিসাবে নিজেকে বন্ধ করবে:
রেজাল্টসেট অবজেক্টটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায় যখন স্টেটমেন্ট অবজেক্ট যা এটি উত্পন্ন করে তা বন্ধ হয়ে যায়, পুনরায় কার্যকর করা হয় বা একাধিক ফলাফলের ক্রম থেকে পরবর্তী ফলাফল পুনরুদ্ধার করতে ব্যবহৃত হয়।
দুর্ভাগ্যক্রমে, অতীতে কিছু জেডিবিসি ড্রাইভার এই প্রতিশ্রুতিটি পালনে অবিচ্ছিন্নভাবে ব্যর্থ হয়েছিল। ফলস্বরূপ, অনেক JDBC এর প্রোগ্রামাররা সহ স্পষ্টভাবে সব ঘনিষ্ঠ তাদের JDBC এর সম্পদ শিখেছি Connection
, PreparedStatement
এবং ResultSet
খুব। রিসোর্স সিন্ট্যাক্স-সহ আধুনিক চেষ্টাটি এত সহজ করে তুলেছে এবং আরও কমপ্যাক্ট কোড দিয়ে। লক্ষ করুন যে, জাভা দল গড়েছে বিব্রত করতে গিয়ে ResultSet
যেমন AutoCloseable
, এবং আমি আপনাকে পরামর্শ দিচ্ছি আমরা যে ব্যবহার করতে। আপনার সমস্ত জেডিবিসি সংস্থার আশেপাশে একটি চেষ্টা সহ-সংস্থান ব্যবহার করা আপনার কোডগুলিকে আপনার উদ্দেশ্য হিসাবে আরও স্ব-ডকুমেন্টিং করে।
কোড উদাহরণ
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()) {
কারণ একটি ফলাফল ফলাফল বস্তুর দ্বারা উত্পাদিত স্টেটমেন্ট অবজেক্টটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যায়