java.sql.SQLException: - ORA-01000: সর্বাধিক উন্মুক্ত কার্সার অতিক্রম করেছে


115

আমি একটি ORA-01000 এসকিউএল ব্যতিক্রম পাচ্ছি। সুতরাং আমি এটি সম্পর্কিত কিছু প্রশ্ন আছে।

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

    { //method try starts  
      String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)";
      pStmt = obj.getConnection().prepareStatement(sql);
      pStmt.setLong(1, subscriberID);
      for (String language : additionalLangs) {
        pStmt.setInt(2, Integer.parseInt(language));
        pStmt.execute();
      }
    } //method/try ends
    
    { //finally starts
       pStmt.close()
    } //finally ends 
  5. যদি সংযোগ আইনে একাধিকবার সংযুক্তি.কেট স্টেটমেন্ট () এবং কান.প্রিপেটস্টেটমেন্ট (এসকিউএল) বলা হয় তবে কী হবে?

সম্পাদনা 1: We . দুর্বল / নরম রেফারেন্স স্টেটমেন্ট অবজেক্টের ব্যবহার কি ফুটো রোধে সহায়তা করবে?

সম্পাদনা 2: 1. কোনও উপায় আছে কি, আমি আমার প্রকল্পে সমস্ত হারিয়ে যাওয়া "স্টেটমেন্ট.ক্লোজ ()" গুলি খুঁজে পেতে পারি? আমি বুঝতে পারি এটি কোনও স্মৃতি ফুটো নয়। তবে আবর্জনা সংগ্রহের জন্য আমার কাছে একটি স্টেটমেন্ট রেফারেন্স (যেখানে নিকটবর্তী () সম্পাদিত হয় না) সন্ধান করতে হবে? কোন সরঞ্জাম উপলব্ধ? নাকি আমাকে নিজেই এটি বিশ্লেষণ করতে হবে?

দয়া করে এটি বুঝতে আমাকে সহায়তা করুন।

সমাধান

ব্যবহারকারীর নাম -VELU এর জন্য ওরাকল ডিবিতে খোলা কার্সারটি সন্ধান করতে

ORACLE মেশিনে যান এবং sysdba হিসাবে স্ক্যালপ্লাস শুরু করুন।

[oracle@db01 ~]$ sqlplus / as sysdba 

তারপরে দৌড়াও

SELECT   A.VALUE,
    S.USERNAME,
    S.SID,
    S.SERIAL#
  FROM V$SESSTAT A,
    V$STATNAME B,
    V$SESSION S
  WHERE A.STATISTIC# = B.STATISTIC#
    AND S.SID        = A.SID
    AND B.NAME       = 'opened cursors current'
    AND USERNAME     = 'VELU';

যদি সম্ভব হয় তবে আমার সমাধানটি আরও বোঝার জন্য দয়া করে আমার উত্তরটি পড়ুন


আপনি কি আপনার সম্পূর্ণ কোড পোস্ট করতে পারেন? আপনি কোথায় উদ্বোধনী বন্ধনী বন্ধ করে বন্ধ করছেন তা দেখার জন্য আকর্ষণীয় হবেfor (String language : additionalLangs) {
জ্যাকব

@ কানগাভেলু সুগুমার: এসও-তে 5 টি ভিন্ন প্রশ্ন জিজ্ঞাসা করবেন না কেন?
জয়ন

1
এখানে একটি প্রতিক্রিয়া আমি খুব দরকারী পাওয়া গেছে stackoverflow.com/a/4507507/501113
chaotic3quilibrium

উত্তরটি দরকারী কিনা দয়া করে তা দেখুন: stackoverflow.com/questions/34716456/…
মানু

ওরাকলে খোলা কার্সারগুলি সন্ধানের জন্য, আপনি এই SYS.V$OPEN_CURSORদর্শনটি একবার দেখে নিতে পারেন । এটি আপনাকে কেবল এসআইডিই নয়, এসকিউএল পাঠ্যও দেবে।
বাস

উত্তর:


290

ORA-01000, সর্বাধিক-ওপেন-কার্সার ত্রুটি, ওরাকল ডাটাবেস বিকাশে একটি অত্যন্ত সাধারণ ত্রুটি। জাভা প্রসঙ্গে, অ্যাপ্লিকেশনটি যখন কোনও ডাটাবেসের উদাহরণে কনফিগার করা কার্সারের চেয়ে আরও বেশি ফলাফল ফলাফল খোলার চেষ্টা করে তখনই এটি ঘটে।

সাধারণ কারণগুলি হ'ল:

  1. কনফিগারেশন ভুল

    • আপনার অ্যাপ্লিকেশনটিতে ডিবিতে কার্সারের চেয়ে ডেটাবেস অনুসন্ধানের জন্য আরও থ্রেড রয়েছে। একটি ক্ষেত্রে হ'ল ডাটাবেজে কার্সারের সংখ্যার চেয়ে বড় সংযোগ এবং থ্রেড পুল রয়েছে where
    • আপনার অনেকগুলি বিকাশকারী বা অ্যাপ্লিকেশন একই ডিবি ইনস্ট্যান্সের সাথে সংযুক্ত রয়েছে (এতে সম্ভবত অনেকগুলি স্কিমা অন্তর্ভুক্ত থাকবে) এবং একসাথে আপনি খুব বেশি সংযোগ ব্যবহার করছেন।
    • সমাধান:

  2. কার্সার ফুটো

    • অ্যাপ্লিকেশনগুলি ফলাফল (জেডিবিসি) বা কার্সার (ডাটাবেজে সঞ্চিত পদ্ধতিতে) বন্ধ করছে না
    • সমাধান : কার্সার ফাঁস বাগগুলি; ডিবিতে কার্সারের সংখ্যা বৃদ্ধি করা অনিবার্য ব্যর্থতাটি কেবল বিলম্ব করে। স্ট্যাটিক কোড বিশ্লেষণ , জেডিবিসি বা অ্যাপ্লিকেশন-স্তরের লগিং এবং ডাটাবেস পর্যবেক্ষণ ব্যবহার করে ফাঁস পাওয়া যায় ।

পটভূমি

এই বিভাগে কার্সারগুলির পিছনে কিছু তত্ত্ব এবং কীভাবে জেডিবিসি ব্যবহার করা উচিত তা বর্ণনা করা হয়েছে। যদি আপনার পটভূমিটি জানা দরকার না হয় তবে আপনি এড়িয়ে গিয়ে সরাসরি 'ইলিমিনেটিং লিকস' এ যেতে পারেন।

কার্সার কী?

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

একটি ডাটাবেস উদাহরণটি সাধারণত একাধিক সেশন সহ বিভিন্ন বিভাজন , বিভিন্ন ব্যবহারকারীদের পরিবেশন করে । এটি করতে, এটিতে সমস্ত স্কিমা, ব্যবহারকারী এবং সেশনগুলির জন্য একটি নির্দিষ্ট সংখ্যক কার্সার উপলব্ধ। যখন সমস্ত কার্সার খোলা থাকে (ব্যবহৃত হয়) এবং অনুরোধটি আসে তার জন্য একটি নতুন কার্সারের প্রয়োজন হয়, অনুরোধটি একটি 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 বয়লারপ্লেটের বেশিরভাগ জায়গায় কিছু সুন্দর সিনট্যাকটিক চিনির সাথে প্রতিস্থাপন করে।

জেডিবিসি অবজেক্ট ধরে রাখা

জেডিবিসি অবজেক্টগুলি স্থানীয় ভেরিয়েবল, অবজেক্ট দৃষ্টান্ত এবং শ্রেণীর সদস্যদের কাছে নিরাপদে রাখা যেতে পারে। এটি সাধারণত ভাল অনুশীলন:

  • দীর্ঘ মেয়াদে একাধিকবার পুনঃব্যবহার করা জেডিবিসি অবজেক্টগুলি ধরে রাখতে অবজেক্ট দৃষ্টান্ত বা শ্রেণীর সদস্যদের ব্যবহার করুন যেমন সংযোগ এবং প্রস্তুতিমূলক স্ট্যাটমেন্টস
  • রেজাল্টসেটের জন্য স্থানীয় ভেরিয়েবলগুলি ব্যবহার করুন যেহেতু এগুলি প্রাপ্ত হয়, লুপ করা হয় এবং তারপরে সাধারণত একক ফাংশনের সুযোগের মধ্যে বন্ধ থাকে।

তবে একটি ব্যতিক্রম রয়েছে: আপনি যদি ইজেবি, বা কোনও সার্লেট / জেএসপি ধারক ব্যবহার করছেন তবে আপনাকে কঠোরভাবে থ্রেডিং মডেলটি অনুসরণ করতে হবে:

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

ফাঁস দূর করা

জেডিবিসি ফাঁস সনাক্তকরণ এবং নির্মূল করতে সহায়তা করার জন্য অনেকগুলি প্রক্রিয়া এবং সরঞ্জাম রয়েছে:

  1. বিকাশের সময় - প্রথম দিকে বাগগুলি ধরা এখন পর্যন্ত সর্বোত্তম পন্থা:

    1. বিকাশের অনুশীলনগুলি: উন্নয়নের উন্নত চর্চাগুলি বিকাশকারীদের ডেস্ক ছেড়ে যাওয়ার আগে আপনার সফ্টওয়্যারটিতে বাগের সংখ্যা হ্রাস করা উচিত। নির্দিষ্ট অনুশীলনের মধ্যে রয়েছে:

      1. জোড় প্রোগ্রামিং , পর্যাপ্ত অভিজ্ঞতা ছাড়াই তাদের শিক্ষিত করা
      2. কোড পর্যালোচনা কারণ অনেক চোখ এক চেয়ে ভাল
      3. ইউনিট টেস্টিং যার অর্থ আপনি কোনও পরীক্ষার সরঞ্জাম থেকে আপনার যে কোনও এবং সমস্ত কোড বেস অনুশীলন করতে পারবেন যা লিকগুলি পুনরুত্পাদন করে তোলে
      4. নিজস্ব বিল্ডিংয়ের চেয়ে সংযোগ পুলিংয়ের জন্য বিদ্যমান গ্রন্থাগারগুলি ব্যবহার করুন
    2. স্ট্যাটিক কোড বিশ্লেষণ: স্ট্যাটিক কোড বিশ্লেষণ সম্পাদন করতে চমৎকার ফাইন্ডব্যাগগুলির মতো একটি সরঞ্জাম ব্যবহার করুন । এটি এমন অনেকগুলি স্থানে নিয়ে আসে যেখানে ঘনিষ্ঠভাবে () সঠিকভাবে পরিচালনা করা হয়নি। ফাইন্ডব্যাগের গ্রহনের জন্য একটি প্লাগইন রয়েছে, তবে এটি এক-অফের জন্যও এককভাবে চালায়, জেনকিনস সিআই এবং অন্যান্য বিল্ড সরঞ্জামগুলিতে একীকরণ রয়েছে

  2. রানটাইম:

    1. দৃability়তা এবং প্রতিশ্রুতিবদ্ধ

      1. যদি রেজাল্টসেট হোল্ডলেবিলিটি রেজাল্টসেট হয় CL CLOSE_CURSORS_OVER_COMMIT, তারপরে সংযোগ.কমিট () পদ্ধতিটি কল করার পরে রেজাল্টসেটটি বন্ধ হয়ে যায়। এটি সংযোগ.সেটহোল্ডিবিলিটি () ব্যবহার করে বা ওভারলোডেড সংযোগ। ক্রিয়েটস্টেটমেন্ট () পদ্ধতি ব্যবহার করে সেট করা যেতে পারে।
    2. রানটাইমে লগইন হচ্ছে।

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

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

অন্যান্য চিন্তা

ক্লোজিং সংযোগগুলি পরিচালনা করতে আপনি WeakReferences ব্যবহার করতে পারেন?

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

আপনি যদি কনস্ট্রাক্টরে কোনও রেফারেন্সকিউ নরম বা দুর্বল রেফারেন্সে পাস করেন তবে বস্তুটি রেফারেন্সকিউতে স্থাপন করা হয় যখন বস্তুটি GC'ed হয় যখন এটি ঘটে (যদি তা কিছুটা ঘটে তখন)। এই পদ্ধতির সাহায্যে আপনি অবজেক্টের চূড়ান্তকরণের সাথে ইন্টারঅ্যাক্ট করতে পারেন এবং আপনি সেই মুহূর্তে অবজেক্টটি বন্ধ বা চূড়ান্ত করতে পারেন।

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

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

টিএল; ডিআর: স্টেটমেন্ট এবং রেজাল্টসেট অবজেক্টগুলিকে পরিচালনা এবং বন্ধ করার জন্য দুর্বল রেফারেন্স মেকানিজম কোনও ভাল উপায় নয়।


3
যদি আপনি কোনও লুপে বিবৃতি তৈরি করেন তবে নিশ্চিত হয়ে নিন যে এটি লুপে বন্ধ রয়েছে অন্যথায় আপনি কেবল শেষ বিবৃতিটি শেষ করে শেষ করবেন।
বেসিলজেমস

ধন্যবাদ, বাসিলজামস আপনার তৈরি পয়েন্টটি যুক্ত করার জন্য সবেমাত্র উত্তর সম্পাদনা করেছেন।
অ্যান্ড্রু অ্যালকক

@ অ্যান্ড্রু অ্যালককে অনেক ধন্যবাদ! অ্যান্ড্রু। আপনি দয়া করে 6 র্থ উত্তর দিতে পারেন।
কানাগাভেলু সুগুমার

@ অ্যান্ড্রুআলকক প্লিজ .. প্লিজ .. প্লিজ .. আমার 7th ম প্রশ্নের উত্তরও দিন। আমাদের প্রকল্পের পর থেকে লোড পরীক্ষার সময় আমরা খুব ঘন ঘন ORA-01000 এর মুখোমুখি হয়েছি। আপনার ইনপুটগুলি আমার জন্য আরও মূল্যবান। অগ্রিম একটি টন ধন্যবাদ !!
কানাগাভেলু সুগুমার

আরই: 7 - আপনি গ্রেপ জাতীয় সরঞ্জাম ব্যবহার করে নৈকট্য অনুসন্ধানের চেষ্টা করতে পারেন। আপনি যখন কোনও এসকিউএল সনাক্ত করেন (নির্বাচন করুন, সন্নিবেশ করান, আপডেট করুন, মুছুন), শব্দের নিকটে () শব্দটির সান্নিধ্য দেখুন। যদি সান্নিধ্যটি প্রত্যাশার চেয়ে আরও দূরে থাকে তবে এটি কোথায় অনুপস্থিত তা তদন্তের একটি উপায় হতে পারে। lightboxtechnologies.com/2012/07/27/…
সান

28

আমি আরও কিছু বোঝার যোগ করছি।

  1. কার্সারটি কেবলমাত্র একটি বিবৃতি সম্পর্কিত বিষয় সম্পর্কে; এটি রেজাল্টসেট বা সংযোগ বস্তু নয়।
  2. তবে এখনও কিছু ওরাকল মেমরি মুক্ত করতে আমাদের রেজাল্টটি বন্ধ করতে হবে। তবুও যদি আপনি ফলাফলটি বন্ধ না করেন যা কার্সরের জন্য গণনা করা হবে না।
  3. বিবৃতি অবজেক্টটি বন্ধ হয়ে গেলে স্বয়ংক্রিয়ভাবে রেজাল্ট অবজেক্টটিও বন্ধ হয়ে যাবে।
  4. সমস্ত নির্বাচন / INSERT / আপডেট / ডিলিট বিবৃতিতে কার্সার তৈরি করা হবে।
  5. প্রতিটি ORACLE DB উদাহরণটি ওরাকল এসআইডি ব্যবহার করে সনাক্ত করা যায়; একইভাবে ORACLE DB সংযোগ এসআইডি ব্যবহার করে প্রতিটি সংযোগ সনাক্ত করতে পারে। দুটি এসআইডিই আলাদা।
  6. সুতরাং ORACLE অধিবেশনটি জেডিবিসি (টিসিপি) সংযোগ ছাড়া কিছুই নয়; যা একটি এসআইডি ছাড়া আর কিছুই নয়।
  7. যদি আমরা সর্বোচ্চ 500 টি হিসাবে কার্সার সেট করে থাকি তবে এটি কেবল একটি জেডিবিসি সেশন / সংযোগ / এসআইডি এর জন্য।
  8. সুতরাং আমরা এর সাথে সম্পর্কিত কোনও কার্সারের (জবানবন্দি) জেডিবিসি সংযোগ রাখতে পারি।
  9. একবার জেভিএম বন্ধ হয়ে গেলে সমস্ত সংযোগ / কার্সার বন্ধ হয়ে যাবে, বা জেডিবিসিসিکشن বন্ধ হয়ে গেলে সেই সংযোগের সাথে সেন্সর বন্ধ হয়ে যাবে।

সিসড্বা হিসাবে লগগিন করুন।

পুট্টিতে (ওরাকল লগইন):

  [oracle@db01 ~]$ sqlplus / as sysdba

স্ক্যালপ্লাসে:

ব্যবহারকারীর নাম: sys as sysdba

সেশন_ক্যাচড_সার্সার্সের মান 0 তে সেট করুন যাতে এটি বন্ধ কার্সার না করে।

 alter session set session_cached_cursors=0
 select * from V$PARAMETER where name='session_cached_cursors'

ডিবিতে প্রতিটি সংযোগ প্রতি বিদ্যমান ওপেন_সুরসরাস ভ্যালুজ সেট নির্বাচন করুন

 SELECT max(a.value) as highest_open_cur, p.value as max_open_cur FROM v$sesstat a, v$statname b, v$parameter p WHERE a.statistic# = b.statistic# AND b.name = 'opened cursors current' AND p.name= 'open_cursors'  GROUP BY p.value;

নীচে খোলা কার্সার মানগুলির সাথে এসআইডি / সংযোগগুলির তালিকা সন্ধানের জন্য ক্যোয়ারী দেওয়া আছে।

 SELECT a.value, s.username, s.sid, s.serial#
 FROM v$sesstat a, v$statname b, v$session s
 WHERE a.statistic# = b.statistic#  AND s.sid=a.sid 
 AND b.name = 'opened cursors current' AND username = 'SCHEMA_NAME_IN_CAPS'

খোলা কার্সারগুলিতে স্কিলগুলি সনাক্ত করতে নীচের ক্যোয়ারীটি ব্যবহার করুন

 SELECT oc.sql_text, s.sid 
 FROM v$open_cursor oc, v$session s
 WHERE OC.sid = S.sid
 AND s.sid=1604
 AND OC.USER_NAME ='SCHEMA_NAME_IN_CAPS'

এখন কোডটি ডিবাগ করুন এবং উপভোগ করুন !!! :)


1
: এখানে আরেকটি ক্যোয়ারী ভাল কাজ বলে মনে হয় যে stackoverflow.com/a/2560415/32453
rogerdpack

4

আপনার কোডটি এভাবে সংশোধন করুন:

try
{ //method try starts  
  String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)";
  pStmt = obj.getConnection().prepareStatement(sql);
  pStmt.setLong(1, subscriberID);
  for (String language : additionalLangs) {
    pStmt.setInt(2, Integer.parseInt(language));
    pStmt.execute();
  }
} //method/try ends
finally
{ //finally starts
   pStmt.close()
} 

আপনি কি নিশ্চিত যে আপনি সত্যিই আপনার স্টেটমেন্টস, সংযোগ এবং ফলাফলগুলি বন্ধ করছেন?

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

একটি উদাহরণ: pStmt = আপত্তি। getConnication () .parepareStatement (sQL);

    class obj{ 

    public Connection getConnection(){
    return new ConnectionDelegator(...here create your connection object and put it into ...);

    } 
}


class ConnectionDelegator implements Connection{
    Connection delegates;

    public ConnectionDelegator(Connection con){
       this.delegates = con;
    }

    public Statement prepareStatement(String sql){
        return delegates.prepareStatement(sql);
    }

    public void close(){
        try{
           delegates.close();
        }finally{
           log.debug(delegates.toString() + " was closed");
        }
    }
}

3

যদি আপনার অ্যাপ্লিকেশনটি কোনও জাভা EE অ্যাপ্লিকেশন হিসাবে অ্যাপ্লিকেশন সার্ভার হিসাবে ওরাকল ওয়েবলজিকে চলছে, তবে এই সমস্যার সম্ভাব্য কারণ হ'ল ওয়েবলজিকের স্টেটমেন্ট ক্যাশে সাইজ সেটিংস।

যদি কোনও নির্দিষ্ট ডেটা উত্সের জন্য স্টেটমেন্ট ক্যাশে সাইজ সেটিংটি ওরাকল ডাটাবেস সর্বাধিক ওপেন কার্সার গণনা সেটিংসের সমান বা তার চেয়ে বেশি হয়, তবে ওয়েললজিক দ্বারা খোলা রাখা ক্যাশেড এসকিউএল বিবৃতি দিয়ে সমস্ত ওপেন কার্সার গ্রাস করা যায়, ফলস্বরূপ ORA-01000 ত্রুটিতে।

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

ওয়েবলজিক 10 অ্যাডমিন কনসোলে, প্রতিটি ডেটা উত্সের জন্য স্টেটমেন্ট ক্যাশে সাইজ সেটিং পরিষেবাদি (বাম এনএভি)> ডেটা সোর্স> (স্বতন্ত্র ডেটা উত্স)> সংযোগ পুল ট্যাবে পাওয়া যাবে।


1
হাইবারনেটের একটি বিবৃতি ক্যাশেও রয়েছে। বিকাশকারীও
পিনো

3

আমিও এই সমস্যার মুখোমুখি হয়েছি below নীচের ব্যতিক্রমগুলি আসত

java.sql.SQLException: - ORA-01000: maximum open cursors exceeded

আমি দাও স্তরের জন্য স্প্রিং জেডিবিসি সহ স্প্রিং ফ্রেমওয়ার্ক ব্যবহার করছিলাম ।

আমার অ্যাপ্লিকেশনটি কোনওভাবে কার্সার ফাঁস করত এবং কয়েক মিনিট বা তার পরে, এটি আমাকে এই ব্যতিক্রমটি দিত।

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

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

কোয়েরিতে অনুসন্ধান করতে এবং যেখানে প্রয়োজন সেখানে যথাযথ বাধা প্রয়োগ করে কলামগুলিতে যথাযথ সূচীকরণ করে সমস্যার সমাধান করতে সক্ষম হয়েছি।


2

আমি আজ একই সমস্যার (ORA-01000) মুখোমুখি হয়েছি। আমি ওরাকল ডিবিতে অনেকবার একটি SELECT স্টেটমেন্ট কার্যকর করার জন্য, the the চেষ্টা করে একটি লুপ পেয়েছিলাম, (প্রতিটি বার প্যারামিটার পরিবর্তন করে), এবং শেষ অবধি usual usual আমার যথারীতি রেজাল্টসেট, রেডিয়ার স্টেটমেন্ট এবং সংযোগ বন্ধ করার কোড ছিল । তবে আমি লুপের নির্দিষ্ট পরিমাণে পৌঁছানোর সাথে সাথেই (1000) খুব বেশি উন্মুক্ত কার্সার সম্পর্কে ওরাকল ত্রুটি পেয়েছি।

উপরের অ্যান্ড্রু অ্যালককের পোস্টের ভিত্তিতে, আমি পরিবর্তনগুলি করেছি যাতে লুপের ভিতরে , আমি প্রতিটি ফলাফল সেট এবং প্রতিটি বিবৃতি ডেটা পাওয়ার পরে এবং আবার লুপ করার আগে বন্ধ করে দিয়েছিলাম এবং এটি সমস্যার সমাধান করে।

অ্যাডিশালি, ঠিক একই সমস্যাটি 300০০ টি বিবৃতি দেওয়ার পরে, অন্য আরেকটি ওরাকল ডিবি (ওআরএ-01000) এ, সন্নিবেশ বিবৃতিগুলির অন্য লুপে ঘটেছিল। আবার এটি একইভাবে সমাধান করা হয়েছিল, সুতরাং প্রস্তুতিমূলক স্টেটমেন্ট বা রেজাল্টসেট বা উভয়ই বন্ধ না হওয়া পর্যন্ত ওপেন কার্সার হিসাবে গণনা করুন।


এটা ঠিক মনে হচ্ছে না। স্প্রিং ডকুমেন্টস যা ফলাফল ফলাফলগুলি বন্ধ করার জন্য দায়ী ( ডকস.স্প্রিং.ইও / স্প্রিং / ডকস / সারেন্ট / স্প্রিং-ফ্রেমওয়ার্ক- রেফারেন্স / )।
রায়ান

কেবল স্পষ্টতার জন্য, সেই উদাহরণগুলিতে আমি স্প্রিং ব্যবহার করছিলাম না।
কিন্নিসন 84

1

আপনি কি অটোকোমিট = সত্য সেট করেছেন? যদি এটি চেষ্টা না করেন:

{ //method try starts  
    String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)";
    Connection conn = obj.getConnection()
    pStmt = conn.prepareStatement(sql);

    for (String language : additionalLangs) {
        pStmt.setLong(1, subscriberID);
        pStmt.setInt(2, Integer.parseInt(language));
        pStmt.execute();
        conn.commit();
    }
} //method/try ends { 
    //finally starts
    pStmt.close()
} //finally ends 

আপনি কি দয়া করে অন্যান্য প্রশ্নের উত্তর দিতে পারেন?
কানগাভেলু সুগুমার

2
স্বতঃসিদ্ধকরণ সংযোগগুলি বন্ধ করে না - এটি কার্যকর হওয়ার পরপরই প্রতিটি বিবৃতি স্বয়ংক্রিয়ভাবে প্রতিশ্রুতিবদ্ধ। আপনি যদি অটোকমিট ব্যবহার করে থাকেন তবে আপনি ডাটাবেসের অন্যতম গুরুত্বপূর্ণ বৈশিষ্ট্য - লেনদেনের থেকে মূল্য পাচ্ছেন না। পরিবর্তে আপনি কোনও নোএসকিউএল ডিবি ব্যবহার করার বিষয়টি বিবেচনা করতে পারেন।
অ্যান্ড্রু অ্যালকক

1

খোলা sql সন্ধানের জন্য ক্যোয়ারী।

SELECT s.machine, oc.user_name, oc.sql_text, count(1) 
FROM v$open_cursor oc, v$session s
WHERE oc.sid = s.sid
and S.USERNAME='XXXX'
GROUP BY user_name, sql_text, machine
HAVING COUNT(1) > 2
ORDER BY count(1) DESC

1

এই সমস্যাটি মূলত তখন ঘটে যখন আপনি সংযোগ পুলিং ব্যবহার করছেন কারণ যখন আপনি সংযোগটি বন্ধ করেন তখন সংযোগটি পুলটিতে ফিরে যায় এবং সেই সংযোগের সাথে যুক্ত সমস্ত কার্সার কখনই বন্ধ হয় না কারণ ডাটাবেসের সাথে সংযোগ এখনও খোলা থাকে। সুতরাং একটি বিকল্প হ'ল পুলে সংযোগগুলির নিষ্ক্রিয় সংযোগের সময় হ্রাস করা, সুতরাং যখনই সংযোগটি 10 ​​সেকেন্ডের জন্য সংযোগে নিষ্ক্রিয় হয়ে বসে থাকে, তখন ডাটাবেসের সাথে সংযোগ বন্ধ হয়ে যায় এবং পুলটিতে রাখার জন্য নতুন সংযোগ তৈরি হয়।



0

আমাদের ক্ষেত্রে, আমরা হাইবারনেট ব্যবহার করছিলাম এবং একই হাইবারনেট ম্যাপযুক্ত সত্তাকে উল্লেখ করে আমাদের অনেকগুলি ভেরিয়েবল ছিল। আমরা এই রেফারেন্সগুলি একটি লুপে তৈরি এবং সংরক্ষণ করছিলাম। প্রতিটি রেফারেন্স একটি কার্সার খোলে এবং এটি খোলা রাখে।

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

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

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


0

ওয়াইল্ডফ্লাই এবং টমক্যাটে আমার ডেটাসোর্সটিতে আমার একটি সমস্যা ছিল, একটি ওরাকল 10 জি-তে সংযোগ স্থাপন করা।

আমি দেখতে পেয়েছি যে নির্দিষ্ট শর্তে স্টেটমেন্ট.ক্লোজ () চালিত হওয়ার পরেও বিবৃতি বন্ধ ছিল না। সমস্যাটি হ'ল ওরাকল ড্রাইভারটি আমরা ব্যবহার করছিলাম: ojdbc7.jar। এই ড্রাইভারটি ওরাকল 12 সি এবং 11 জি এর জন্য নির্মিত এবং ওরাকল 10 জি ব্যবহার করার সময় এটিতে কিছু সমস্যা রয়েছে বলে আমি মনে করি ওজডবিসি 5.জারে ডাউনগ্রেড এবং এখন সবকিছু ঠিকঠাক চলছে।


0

আমি একই সমস্যার মুখোমুখি হয়েছি কারণ আমি 1000 টিরও বেশি পুনরাবৃত্তির জন্য ডিবি জিজ্ঞাসা করছি। আমি চেষ্টা করেছি এবং শেষ পর্যন্ত আমার কোড ব্যবহার করেছি। তবে তবু ত্রুটি হচ্ছিল।

এটি সমাধানের জন্য আমি কেবল ওরাকল ডিবিতে লগইন করেছি এবং কোয়েরির নীচে দৌড়েছি:

অলটার সিস্টেম সেট ওপেন_সার্স = 8000 এসসিইপি = উভয়;

এবং এই সঙ্গে সঙ্গে আমার সমস্যা সমাধান।


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