পুলে জেডিবিসি সংযোগ বন্ধ করা হচ্ছে


109

জেডিবিসি ব্যবহারের জন্য আমাদের স্ট্যান্ডার্ড কোড বিভাগটি হ'ল ...

Connection conn = getConnection(...);
Statement  stmt = conn.conn.createStatement (ResultSet.TYPE_SCROLL_INSENSITIVE,
                                                ResultSet.CONCUR_READ_ONLY);
ResultSet  rset = stmt.executeQuery (sqlQuery);

// do stuff with rset

rset.close(); stmt.close(); conn.close();

প্রশ্ন 1: সংযোগ পুলটি ব্যবহার করার সময়, শেষে কোনওটি সংযোগটি বন্ধ করে দেওয়া উচিত? যদি তাই হয়, পুলিংয়ের উদ্দেশ্যটি কি হারিয়ে যায় না? এবং যদি তা না হয় তবে সংযোগের কোনও নির্দিষ্ট উদাহরণ মুক্ত হয়ে পুনরায় ব্যবহার করা যেতে পারে তখন ডেটা সোর্স কীভাবে জানতে পারে? আমি এটির জন্য একটু বিভ্রান্ত হয়েছি, যে কোনও পয়েন্টার প্রশংসা করেছেন।

প্রশ্ন 2: নিম্নলিখিত পদ্ধতিটি কি মানের কাছাকাছি কিছু আছে? পুল থেকে সংযোগ পাওয়ার চেষ্টা বলে মনে হচ্ছে, এবং যদি ডেটা সোর্স স্থাপন করা যায় না, তবে পুরানো ফ্যাশনযুক্ত ড্রাইভারম্যানেজারটি ব্যবহার করুন। রানটাইমের সময় কোন অংশটি কার্যকর হচ্ছে তা আমরা এখনও নিশ্চিত নই। উপরের প্রশ্নটি পুনরাবৃত্তি করে, কেউ কি এই জাতীয় পদ্ধতিতে সংযোগটি বন্ধ করতে হবে?

আপনাকে ধন্যবাদ, - এমএস

synchronized public Connection getConnection (boolean pooledConnection)
                                                        throws SQLException {
        if (pooledConnection) {
                if (ds == null) {
                        try {
                                Context envCtx = (Context)
                                        new InitialContext().lookup("java:comp/env");
                                ds = (DataSource) envCtx.lookup("jdbc/NamedInTomcat");
                                return ds.getConnection();
                        } catch (NamingException e) {
                                e.printStackTrace();
                }}
                return (ds == null) ? getConnection (false) : ds.getConnection();
        }
        return DriverManager.getConnection(
                "jdbc:mysql://"+ipaddy+":"+dbPort +"/" + dbName, uName, pWord);
}

সম্পাদনা: আমার মনে হয় যেহেতু আমরা কোনও স্ট্যাক ট্রেস দেখতে পাচ্ছি না তাই আমরা পুলের সংযোগ পাচ্ছি।

উত্তর:


121

সংযোগ পুলটি ব্যবহার করার সময়, শেষে কি সংযোগটি বন্ধ করা উচিত? যদি তাই হয়, পুলিংয়ের উদ্দেশ্যটি কি হারিয়ে যায় না? এবং যদি তা না হয় তবে সংযোগের কোনও নির্দিষ্ট উদাহরণ মুক্ত হয়ে পুনরায় ব্যবহার করা যেতে পারে তখন ডেটা সোর্স কীভাবে জানতে পারে? আমি এটির জন্য একটু বিভ্রান্ত হয়েছি, যে কোনও পয়েন্টার প্রশংসা করেছেন।

হ্যাঁ, অবশ্যই আপনাকে পোল্ড সংযোগটিও বন্ধ করতে হবে। এটি প্রকৃত সংযোগের চারপাশে একটি মোড়ক। এটি কভারগুলির নীচে উইলে প্রকৃত সংযোগটি পুলটিতে ছেড়ে দেয়। প্রকৃত সংযোগটি আসলে বন্ধ হয়ে যাবে বা কোনও নতুন getConnection()কলের জন্য পুনরায় ব্যবহার করা হবে কিনা তা সিদ্ধান্ত নেওয়ার বিষয়টি আরও অবধি পুল । সুতরাং, আপনি একটি সংযোগ পুকুর ব্যবহার করছেন কিনা নির্বিশেষে বা না আপনি উচিত সবসময় ঘনিষ্ঠ সব মধ্যে বিপরীত অনুক্রমে JDBC এর সম্পদ finallyব্লক tryব্লক যেখানে আপনি তাদের অর্জিত করেছি। জাভা 7 এ try-with-resourcesস্টেটমেন্ট ব্যবহার করে আরও সরল করা যায় ।


নিম্নলিখিত পদ্ধতিটি কি মানের কাছাকাছি কিছু আছে? পুল থেকে সংযোগ পাওয়ার চেষ্টা বলে মনে হচ্ছে, এবং যদি ডেটা সোর্স স্থাপন করা যায় না, তবে পুরানো ফ্যাশনযুক্ত ড্রাইভারম্যানেজারটি ব্যবহার করুন। রানটাইমের সময় কোন অংশটি কার্যকর হচ্ছে তা আমরা এখনও নিশ্চিত নই। উপরের প্রশ্নটি পুনরাবৃত্তি করে, কেউ কি এই জাতীয় পদ্ধতিতে সংযোগটি বন্ধ করতে হবে?

উদাহরণটি বেশ ভীতিজনক। DataSourceঅ্যাপ্লিকেশনওয়ালা ডিবি কনফিগার শ্রেণীর কিছু কনস্ট্রাক্টর / ইনিশিয়ালাইজেশনে অ্যাপ্লিকেশন শুরু করার সময় আপনাকে কেবল একবার একবার অনুসন্ধান / আরম্ভ করতে হবে । তারপরে getConnection()অ্যাপলের জীবদ্দশায় কেবলমাত্র এক এবং একই ডেটাসোর্সটিতে কল করুন। সিঙ্ক্রোনাইজেশন বা নাল চেকের দরকার নেই।

আরো দেখুন:


এটি কী করছে তা একবার (একবার আরম্ভ করুন), তাই না? ডিএস হ'ল একটি উদাহরণ পরিবর্তনশীল, এবং যদি (ডিএস == নাল) ... আরম্ভের অংশ।
মণিদীপ সেনগুপ্ত

গেট -পদ্ধতিতে প্রতিবার চেক getConnection()করা অদ্ভুত। সিঙ্ক্রোনাইজেশন / নাল চেক ছাড়াই কেবল এটি খুব একই শ্রেণীর ক্যাটার বা প্রারম্ভিককরণ ব্লকে করুন। এটি একবার কল করা হবে। আরও ইঙ্গিত এবং কিক অফ উদাহরণগুলির জন্য, আপনি এই নিবন্ধটি দরকারী মনে করতে পারেন ।
বালুসসি

দুর্দান্ত নিবন্ধ, বালুসসি। আমি যে শ্রেণীর সাথে কাজ করছি সেগুলি ডিটিও ব্যবহার করে ডেটা লেয়ার প্রয়োগ করে। আমি আপনার সাথে একমত, সূচনাটি কনস্ট্রাক্টরে থাকতে হবে। এখন, এই শ্রেণীর একাধিক পদ্ধতি রয়েছে, প্রত্যেকে স্থানীয় ভেরিয়েবল হিসাবে সংযোগ, স্টেমটি এবং আরসেট সহ, সংযোগগুলি একটি ট্রাই ব্লকে রয়েছে এবং শেষ পর্যন্ত একটি 1-লাইনের কল সিএসআর ক্লোস রয়েছে (সংযোগ, স্টেমটি, আরএসেট), যেখানে সমস্ত 3 বন্ধ (বিপরীত ক্রমে)। এখন, আপনি যে ডিটিওর উদাহরণটি বিকাশ করেছেন তা হ'ল একটি ডিবি টেবিল সারিটির একটি মিরর চিত্র। আমাদের যোগদানের (এবং অন্যান্য ধারা) নিয়ে জটিল এসকিউএল কোয়েরি রয়েছে, কীভাবে এই জাতীয় ফলাফলের জন্য ডিএও'র বিকাশ করা যায় সে সম্পর্কে আপনার কোনও নিবন্ধ আছে?
মণিদীপ সেনগুপ্ত

2
@ আইয়াত: আপনি যেখানে সেগুলি তৈরি করেছেন / তৈরি করেছেন সেভাবে আপনাকে একই ব্লকের close()সকলকে কল করতে হবে । এটি সম্পূর্ণ পুল বা সংযোগ কিনা তা নির্বিশেষে is finallytry
BalusC

1
@ আই জাভা: এই পুলটি একজন অপেশাদার দ্বারা রচিত যাঁর কী করছেন তার কোনও ধারণা নেই। এটি উপেক্ষা করুন এবং একটি বাস্তব গ্রন্থাগারের জন্য যান। যেমন হিকারিসিপি CP
বালাসসি

22

পুলগুলি সাধারণত আপনাকে একটি মোড়ানো সংযোগ অবজেক্টটি ফিরিয়ে দেয়, যেখানে ঘনিষ্ঠ () পদ্ধতিটি ওভাররাইড করা হয়, সাধারণত সংযোগটি পুলটিতে ফিরে আসে। কাছাকাছি কল করা () ঠিক আছে এবং সম্ভবত এখনও প্রয়োজন।

একটি ঘনিষ্ঠ () পদ্ধতি সম্ভবত এটির মতো দেখাবে:

public void close() throws SQLException {
  pool.returnConnection(this);
}

আপনার দ্বিতীয় প্রশ্নের জন্য, নীচের ব্লকটি কখনও চালিত হয় কিনা তা দেখানোর জন্য আপনি কোনও লগার যুক্ত করতে পারেন। আমি কল্পনা করব যদিও আপনি আপনার ডাটাবেস সংযোগগুলির কনফিগারেশনের জন্য কেবল একটি উপায় বা অন্যটি চান। আমরা কেবল আমাদের ডাটাবেস অ্যাক্সেসের জন্য একটি পুল ব্যবহার করি। যেভাবেই হোক, ফাঁস রোধে সংযোগ বন্ধ করা বেশ গুরুত্বপূর্ণ।


আমি সম্মত হই, আমাদের একটি লগার রয়েছে এবং এটি এখানেও ব্যবহার করা যেতে পারে। আপনি কীভাবে
কোনও অবজেক্টকে গুটিয়ে

1
Calling close() is OK and probably still required., নিকট না ডাকলে সংযোগ ফাঁস হবে, যদি না পুলটি কিছু পুনরুদ্ধার কৌশল প্রয়োগ করে না
svarog

0

প্রকৃতপক্ষে, সংযোগ ব্যবস্থাপনার সর্বোত্তম পন্থা হ'ল এটিকে কোথাও যে কোনও কোডে না ফেলা।

এমন একটি SQLExecutor ক্লাস তৈরি করুন যা একমাত্র একমাত্র অবস্থান যা সংযোগগুলি খোলে এবং বন্ধ করে দেয়।

পুরো অ্যাপ্লিকেশনটির পরে পুল থেকে সংযোগ পেতে এবং পুরো জায়গা জুড়ে পরিচালনা (বা সেগুলি অপব্যবস্থাপনা) না করে এক্সিকিউটারের কাছে বিবৃতি পাম্প করে।

আপনি যেমন চান তেমন এক্সিকিউটারের অনেকগুলি উদাহরণ থাকতে পারে, তবে কারও পক্ষে এমন কোনও রাইটিং কোড থাকা উচিত নয় যা নিজের পক্ষে সংযোগ খুলবে এবং বন্ধ করে দেবে।

সুবিধাজনকভাবে, এটি আপনাকে কোডের একক সেট থেকে আপনার সমস্ত এসকিউএল লগ করতে দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.