ORA-01000, সর্বাধিক-ওপেন-কার্সার ত্রুটি, ওরাকল ডাটাবেস বিকাশে একটি অত্যন্ত সাধারণ ত্রুটি। জাভা প্রসঙ্গে, অ্যাপ্লিকেশনটি যখন কোনও ডাটাবেসের উদাহরণে কনফিগার করা কার্সারের চেয়ে আরও বেশি ফলাফল ফলাফল খোলার চেষ্টা করে তখনই এটি ঘটে।
সাধারণ কারণগুলি হ'ল:
কনফিগারেশন ভুল
- আপনার অ্যাপ্লিকেশনটিতে ডিবিতে কার্সারের চেয়ে ডেটাবেস অনুসন্ধানের জন্য আরও থ্রেড রয়েছে। একটি ক্ষেত্রে হ'ল ডাটাবেজে কার্সারের সংখ্যার চেয়ে বড় সংযোগ এবং থ্রেড পুল রয়েছে where
- আপনার অনেকগুলি বিকাশকারী বা অ্যাপ্লিকেশন একই ডিবি ইনস্ট্যান্সের সাথে সংযুক্ত রয়েছে (এতে সম্ভবত অনেকগুলি স্কিমা অন্তর্ভুক্ত থাকবে) এবং একসাথে আপনি খুব বেশি সংযোগ ব্যবহার করছেন।
সমাধান:
কার্সার ফুটো
- অ্যাপ্লিকেশনগুলি ফলাফল (জেডিবিসি) বা কার্সার (ডাটাবেজে সঞ্চিত পদ্ধতিতে) বন্ধ করছে না
- সমাধান : কার্সার ফাঁস বাগগুলি; ডিবিতে কার্সারের সংখ্যা বৃদ্ধি করা অনিবার্য ব্যর্থতাটি কেবল বিলম্ব করে। স্ট্যাটিক কোড বিশ্লেষণ , জেডিবিসি বা অ্যাপ্লিকেশন-স্তরের লগিং এবং ডাটাবেস পর্যবেক্ষণ ব্যবহার করে ফাঁস পাওয়া যায় ।
পটভূমি
এই বিভাগে কার্সারগুলির পিছনে কিছু তত্ত্ব এবং কীভাবে জেডিবিসি ব্যবহার করা উচিত তা বর্ণনা করা হয়েছে। যদি আপনার পটভূমিটি জানা দরকার না হয় তবে আপনি এড়িয়ে গিয়ে সরাসরি 'ইলিমিনেটিং লিকস' এ যেতে পারেন।
কার্সার কী?
একটি কার্সার হ'ল ডাটাবেসটিতে এমন একটি সংস্থান যা কোনও ক্যোয়ারির স্থিতি রাখে, বিশেষত সেই অবস্থান যেখানে পাঠক একটি রেজাল্টসেটে থাকে। প্রতিটি নির্বাচনী বিবৃতিতে একটি কার্সার থাকে এবং পিএল / এসকিউএল সঞ্চিত পদ্ধতিগুলি যতগুলি কার্সার প্রয়োজন তত খুলে এবং ব্যবহার করতে পারে। আপনি ওফাকের উপর কার্সার সম্পর্কে আরও জানতে পারেন ।
একটি ডাটাবেস উদাহরণটি সাধারণত একাধিক সেশন সহ বিভিন্ন বিভাজন , বিভিন্ন ব্যবহারকারীদের পরিবেশন করে । এটি করতে, এটিতে সমস্ত স্কিমা, ব্যবহারকারী এবং সেশনগুলির জন্য একটি নির্দিষ্ট সংখ্যক কার্সার উপলব্ধ। যখন সমস্ত কার্সার খোলা থাকে (ব্যবহৃত হয়) এবং অনুরোধটি আসে তার জন্য একটি নতুন কার্সারের প্রয়োজন হয়, অনুরোধটি একটি ORA-010000 ত্রুটির সাথে ব্যর্থ হয়।
কার্সার সংখ্যা সন্ধান এবং সেট করা
নম্বরটি সাধারণত ডিবিএ ইনস্টলেশন দ্বারা কনফিগার করা হয়। ওরাকল এসকিউএল বিকাশকারী প্রশাসকের কার্যক্রমে বর্তমানে ব্যবহৃত কার্সার সংখ্যা, সর্বাধিক সংখ্যা এবং কনফিগারেশন ব্যবহার করা যেতে পারে । এসকিউএল থেকে এটি সেট করা যেতে পারে:
ALTER SYSTEM SET OPEN_CURSORS=1337 SID='*' SCOPE=BOTH;
ডিবিতে কার্সারগুলিতে জেভিএম-তে জেডিবিসি সম্পর্কিত
নীচের জেডিবিসি অবজেক্টগুলি নিম্নোক্ত ডাটাবেস ধারণাগুলিতে শক্তভাবে মিলিত হয়েছে:
- জেডিবিসি সংযোগ একটি ডাটাবেস সেশনের ক্লায়েন্টের প্রতিনিধিত্ব এবং ডাটাবেস লেনদেন সরবরাহ করে । কোনও সংযোগে যে কোনও সময়ে কেবলমাত্র একক লেনদেন খোলা থাকতে পারে (তবে লেনদেনগুলি বাসা বাঁধতে পারে)
- একটি জেডিবিসি রেজাল্টসেটটি ডেটাবেজে একক কার্সার দ্বারা সমর্থিত । যখন রেজোল্টসেটে ক্লোজ () ডাকা হয়, কার্সারটি প্রকাশিত হয়।
- একটি জেডিবিসি কলএল স্টেটমেন্ট ডাটাবেসে একটি সঞ্চিত প্রক্রিয়া আহ্বান করে, প্রায়শই পিএল / এসকিউএল লেখা হয়। সঞ্চিত পদ্ধতিটি শূন্য বা আরও বেশি কার্সার তৈরি করতে পারে এবং জেডিবিসি রেজাল্টসেট হিসাবে একটি কার্সার ফিরিয়ে দিতে পারে।
জেডিবিসি থ্রেড নিরাপদ: বিভিন্ন জেডিবিসি অবজেক্টগুলিকে থ্রেডের মধ্যে দিয়ে দেওয়া বেশ ঠিক।
উদাহরণস্বরূপ, আপনি একটি থ্রেডে সংযোগ তৈরি করতে পারেন; অন্য থ্রেড একটি প্রস্তুতিমূলক স্টেটমেন্ট তৈরি করতে এই সংযোগটি ব্যবহার করতে পারে এবং তৃতীয় থ্রেড ফলাফল সেটটি প্রক্রিয়া করতে পারে। একক প্রধান সীমাবদ্ধতা হ'ল যে কোনও সময় আপনার একাধিক রেজাল্টসেট একক প্রস্তুতিমূলক স্টেটমেন্টে খোলা থাকতে পারে না। দেখুন ওরাকল ডিবি কি সংযোগে একাধিক (সমান্তরাল) ক্রিয়াকলাপ সমর্থন করে?
নোট করুন যে কোনও সংযোগে একটি ডাটাবেস প্রতিশ্রুতি ঘটে এবং তাই সংযোগের সমস্ত ডিএমএল (INSERT, আপডেট এবং মুছে ফেলা) একসাথে প্রতিশ্রুতিবদ্ধ। অতএব, আপনি যদি একই সাথে একাধিক লেনদেনকে সমর্থন করতে চান তবে প্রতিটি সমবর্তী লেনদেনের জন্য আপনার অবশ্যই কমপক্ষে একটি সংযোগ থাকতে হবে।
জেডিবিসি অবজেক্ট বন্ধ করা হচ্ছে
রেজাল্টসেটটি কার্যকর করার একটি সাধারণ উদাহরণ হ'ল:
Statement stmt = conn.createStatement();
try {
ResultSet rs = stmt.executeQuery( "SELECT FULL_NAME FROM EMP" );
try {
while ( rs.next() ) {
System.out.println( "Name: " + rs.getString("FULL_NAME") );
}
} finally {
try { rs.close(); } catch (Exception ignore) { }
}
} finally {
try { stmt.close(); } catch (Exception ignore) { }
}
নোটটি কীভাবে বন্ধ () দ্বারা উত্থাপিত কোনও ব্যতিক্রম উপেক্ষা করে তা নোট করুন:
- আপনি যদি}} ক্যাচ {try চেষ্টা না করে রেজাল্টসেটটি কেবল বন্ধ করেন তবে এটি ব্যর্থ হতে পারে এবং বিবৃতিটি বন্ধ হওয়া থেকে রোধ করতে পারে
- আমরা কলারের কাছে প্রচার করার চেষ্টা করার চেষ্টা করি না কেন আমরা তার মধ্যে কোনও ব্যতিক্রম ছড়িয়ে দিতে পারি। আপনার যদি একটি লুপ শেষ হয়ে যায়, উদাহরণস্বরূপ, বিবৃতি তৈরি করা এবং সম্পাদন করা, লুপের মধ্যে প্রতিটি বিবৃতি বন্ধ করে রাখতে ভুলবেন না।
জাভা 7-এ, ওরাকল অটোক্লোজেবল ইন্টারফেস চালু করেছে যা জাভা 6 বয়লারপ্লেটের বেশিরভাগ জায়গায় কিছু সুন্দর সিনট্যাকটিক চিনির সাথে প্রতিস্থাপন করে।
জেডিবিসি অবজেক্ট ধরে রাখা
জেডিবিসি অবজেক্টগুলি স্থানীয় ভেরিয়েবল, অবজেক্ট দৃষ্টান্ত এবং শ্রেণীর সদস্যদের কাছে নিরাপদে রাখা যেতে পারে। এটি সাধারণত ভাল অনুশীলন:
- দীর্ঘ মেয়াদে একাধিকবার পুনঃব্যবহার করা জেডিবিসি অবজেক্টগুলি ধরে রাখতে অবজেক্ট দৃষ্টান্ত বা শ্রেণীর সদস্যদের ব্যবহার করুন যেমন সংযোগ এবং প্রস্তুতিমূলক স্ট্যাটমেন্টস
- রেজাল্টসেটের জন্য স্থানীয় ভেরিয়েবলগুলি ব্যবহার করুন যেহেতু এগুলি প্রাপ্ত হয়, লুপ করা হয় এবং তারপরে সাধারণত একক ফাংশনের সুযোগের মধ্যে বন্ধ থাকে।
তবে একটি ব্যতিক্রম রয়েছে: আপনি যদি ইজেবি, বা কোনও সার্লেট / জেএসপি ধারক ব্যবহার করছেন তবে আপনাকে কঠোরভাবে থ্রেডিং মডেলটি অনুসরণ করতে হবে:
- কেবলমাত্র অ্যাপ্লিকেশন সার্ভার থ্রেড তৈরি করে (এটি দিয়ে আগত অনুরোধগুলি পরিচালনা করে)
- কেবল অ্যাপ্লিকেশন সার্ভার সংযোগ তৈরি করে (যা আপনি সংযোগ পুল থেকে পান)
- কলগুলির মধ্যে মান (রাষ্ট্র) সংরক্ষণ করার সময়, আপনাকে খুব সতর্কতা অবলম্বন করতে হবে। নিজের ক্যাশে বা স্থিতিশীল সদস্যদের মধ্যে কখনও মূল্যবোধ সঞ্চয় করবেন না - এটি ক্লাস্টার এবং অন্যান্য অদ্ভুত অবস্থার মধ্যে নিরাপদ নয় এবং অ্যাপ্লিকেশন সার্ভার আপনার ডেটাতে ভয়ঙ্কর কাজ করতে পারে। পরিবর্তে রাষ্ট্রীয় মটরশুটি বা একটি ডাটাবেস ব্যবহার করুন।
- বিশেষত, জেডিবিসি অবজেক্টগুলি (সংযোগগুলি, ফলাফলসেটস, প্রস্তুতিমূলক স্টেটমেন্টস, ইত্যাদি) কখনও কখনও বিভিন্ন দূরবর্তী অনুরোধের উপরে রাখবেন না - অ্যাপ্লিকেশন সার্ভারটি এটি পরিচালনা করতে দিন। অ্যাপ্লিকেশন সার্ভার কেবল একটি সংযোগ পুল সরবরাহ করে না, এটি আপনার প্রস্তুতির স্টেশমেন্টগুলিও ক্যাশে করে।
ফাঁস দূর করা
জেডিবিসি ফাঁস সনাক্তকরণ এবং নির্মূল করতে সহায়তা করার জন্য অনেকগুলি প্রক্রিয়া এবং সরঞ্জাম রয়েছে:
বিকাশের সময় - প্রথম দিকে বাগগুলি ধরা এখন পর্যন্ত সর্বোত্তম পন্থা:
বিকাশের অনুশীলনগুলি: উন্নয়নের উন্নত চর্চাগুলি বিকাশকারীদের ডেস্ক ছেড়ে যাওয়ার আগে আপনার সফ্টওয়্যারটিতে বাগের সংখ্যা হ্রাস করা উচিত। নির্দিষ্ট অনুশীলনের মধ্যে রয়েছে:
- জোড় প্রোগ্রামিং , পর্যাপ্ত অভিজ্ঞতা ছাড়াই তাদের শিক্ষিত করা
- কোড পর্যালোচনা কারণ অনেক চোখ এক চেয়ে ভাল
- ইউনিট টেস্টিং যার অর্থ আপনি কোনও পরীক্ষার সরঞ্জাম থেকে আপনার যে কোনও এবং সমস্ত কোড বেস অনুশীলন করতে পারবেন যা লিকগুলি পুনরুত্পাদন করে তোলে
- নিজস্ব বিল্ডিংয়ের চেয়ে সংযোগ পুলিংয়ের জন্য বিদ্যমান গ্রন্থাগারগুলি ব্যবহার করুন
স্ট্যাটিক কোড বিশ্লেষণ: স্ট্যাটিক কোড বিশ্লেষণ সম্পাদন করতে চমৎকার ফাইন্ডব্যাগগুলির মতো একটি সরঞ্জাম ব্যবহার করুন । এটি এমন অনেকগুলি স্থানে নিয়ে আসে যেখানে ঘনিষ্ঠভাবে () সঠিকভাবে পরিচালনা করা হয়নি। ফাইন্ডব্যাগের গ্রহনের জন্য একটি প্লাগইন রয়েছে, তবে এটি এক-অফের জন্যও এককভাবে চালায়, জেনকিনস সিআই এবং অন্যান্য বিল্ড সরঞ্জামগুলিতে একীকরণ রয়েছে
রানটাইম:
দৃability়তা এবং প্রতিশ্রুতিবদ্ধ
- যদি রেজাল্টসেট হোল্ডলেবিলিটি রেজাল্টসেট হয় CL CLOSE_CURSORS_OVER_COMMIT, তারপরে সংযোগ.কমিট () পদ্ধতিটি কল করার পরে রেজাল্টসেটটি বন্ধ হয়ে যায়। এটি সংযোগ.সেটহোল্ডিবিলিটি () ব্যবহার করে বা ওভারলোডেড সংযোগ। ক্রিয়েটস্টেটমেন্ট () পদ্ধতি ব্যবহার করে সেট করা যেতে পারে।
রানটাইমে লগইন হচ্ছে।
- আপনার কোডে ভাল লগ স্টেটমেন্ট রাখুন। এগুলি পরিষ্কার এবং বোধগম্য হওয়া উচিত যাতে গ্রাহক, সহায়তা কর্মী এবং সতীর্থরা প্রশিক্ষণ ছাড়াই বুঝতে পারে। এগুলি সংক্ষিপ্ত হওয়া উচিত এবং কী / ভেরিয়েবল এবং বৈশিষ্ট্যগুলির রাষ্ট্র / অভ্যন্তরীণ মানগুলি মুদ্রণ করা উচিত যাতে আপনি প্রক্রিয়াকরণের যুক্তি সন্ধান করতে পারেন। ডিবাগিং অ্যাপ্লিকেশনগুলিতে ভাল লগিং মৌলিক, বিশেষতঃ যা মোতায়েন করা হয়েছে।
আপনি আপনার প্রকল্পে একটি ডিবাগিং জেডিবিসি ড্রাইভার যুক্ত করতে পারেন (ডিবাগিংয়ের জন্য - বাস্তবে এটি মোতায়েন করবেন না)। একটি উদাহরণ (আমি এটি ব্যবহার করিনি ) হ'ল লগ 4 জেডিবিসি । এরপরে কোন এক্সিকিউটিভের সাথে সম্পর্কিত কোনও সম্পর্ক নেই তার জন্য আপনাকে এই ফাইলটিতে কিছু সাধারণ বিশ্লেষণ করতে হবে। কোনও সম্ভাব্য সমস্যা থাকলে খোলা এবং বন্ধের গণনা হাইলাইট করা উচিত
- ডাটাবেস নিরীক্ষণ। এসকিউএল বিকাশকারী 'মনিটর এসকিউএল' ফাংশন বা কোয়েস্টের টোডের মতো সরঞ্জামগুলি ব্যবহার করে আপনার চলমান অ্যাপ্লিকেশনটি পর্যবেক্ষণ করুন । পর্যবেক্ষণ এই নিবন্ধে বর্ণিত হয় । পর্যবেক্ষণের সময়, আপনি খোলা কার্সারগুলি জিজ্ঞাসা করুন (যেমন টেবিল ভি es সেসেট্যাট থেকে) এবং তাদের এসকিউএল পর্যালোচনা করুন। যদি কার্সার সংখ্যা বাড়ছে, এবং (সর্বাধিক গুরুত্বপূর্ণ) একটি অভিন্ন এসকিউএল বিবৃতি দ্বারা প্রভাবিত হচ্ছে, আপনি জানেন যে আপনার এসকিউএল সহ একটি ফুটো আছে। আপনার কোড এবং পর্যালোচনা অনুসন্ধান করুন।
অন্যান্য চিন্তা
ক্লোজিং সংযোগগুলি পরিচালনা করতে আপনি WeakReferences ব্যবহার করতে পারেন?
দুর্বল এবং নরম রেফারেন্সগুলি আপনাকে এমন কোনও উপায়ে রেফারেন্স দেওয়ার অনুমতি দেওয়ার উপায় যা জেভিএমকে আবর্জনা মঞ্জুর করার উপযুক্ত মনে করে যে কোনও সময় রেফারেন্ট সংগ্রহ করতে দেয় (ধরে নিই যে সেই বস্তুর কোনও শক্তিশালী রেফারেন্স চেইন নেই)।
আপনি যদি কনস্ট্রাক্টরে কোনও রেফারেন্সকিউ নরম বা দুর্বল রেফারেন্সে পাস করেন তবে বস্তুটি রেফারেন্সকিউতে স্থাপন করা হয় যখন বস্তুটি GC'ed হয় যখন এটি ঘটে (যদি তা কিছুটা ঘটে তখন)। এই পদ্ধতির সাহায্যে আপনি অবজেক্টের চূড়ান্তকরণের সাথে ইন্টারঅ্যাক্ট করতে পারেন এবং আপনি সেই মুহূর্তে অবজেক্টটি বন্ধ বা চূড়ান্ত করতে পারেন।
ফ্যান্টম রেফারেন্সগুলি কিছুটা অদ্ভুত; তাদের উদ্দেশ্য কেবলমাত্র চূড়ান্তকরণ নিয়ন্ত্রণ করা, তবে আপনি কখনই আসল অবজেক্টের রেফারেন্স পেতে পারেন না, সুতরাং এটির নিকটবর্তী () পদ্ধতিটি কল করা শক্ত হতে চলেছে।
যাইহোক, যখন জিসি চালানো হয় তখন এটি নিয়ন্ত্রণ করার চেষ্টা করা খুব কমই ভাল ধারণা (দুর্বল, সফট এবং ফ্যান্টম রেফারেন্সগুলি আপনাকে এই বিষয়টি জানতে পারে যে বস্তুর জিসির জন্য সজ্জিত রয়েছে )। আসলে, যদি জভিএম-তে মেমরির পরিমাণ বড় হয় (উদাহরণস্বরূপ - এক্সএমএক্স 2000 এম) আপনি কখনই এই বস্তুকে জিসি করতে পারবেন না এবং আপনি এখনও ওআরএ -01000 অনুভব করতে পারবেন। যদি আপনার প্রোগ্রামের প্রয়োজনীয়তার তুলনায় জেভিএম মেমরিটি সামান্য হয় তবে আপনি দেখতে পাবেন যে রেজাল্টসেট এবং রেডিয়ার স্টেটমেন্ট অবজেক্টগুলি তৈরি হওয়ার সাথে সাথেই (আপনি তাদের কাছ থেকে পড়ার আগে) GCed করা হয়েছে যা সম্ভবত আপনার প্রোগ্রামকে ব্যর্থ করবে।
টিএল; ডিআর: স্টেটমেন্ট এবং রেজাল্টসেট অবজেক্টগুলিকে পরিচালনা এবং বন্ধ করার জন্য দুর্বল রেফারেন্স মেকানিজম কোনও ভাল উপায় নয়।
for (String language : additionalLangs) {