org.postgresql.util.PSQLException: FATAL: দুঃখিত, ইতিমধ্যে অনেক ক্লায়েন্ট


93

আমি একটি পোস্টগ্র্যাস্কল ডাটাবেসে সংযোগ দেওয়ার চেষ্টা করছি, আমি নিম্নলিখিত ত্রুটিটি পাচ্ছি:

ত্রুটি: org.postgresql.util.PSQLException: FATAL: দুঃখিত, ইতিমধ্যে অনেক ক্লায়েন্ট

ত্রুটির অর্থ কী এবং আমি কীভাবে এটি ঠিক করব?

আমার server.propertiesফাইলটি নিম্নলিখিত:

serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

উত্তর:


39

আমরা জানি না যে সার্ভার.প্রপার্টি ফাইলগুলি কী, আমরা উভয়ই জানি না যে সিমোকোপুলসাইজ মানে (আপনি কি?)

ধরে নেওয়া যাক আপনি কিছু কাস্টম পুল ডাটাবেস সংযোগ ব্যবহার করছেন। তারপরে, আমি অনুমান করি যে সমস্যাটি হ'ল আপনার পুলটি 100 বা 120 সংযোগ খোলার জন্য কনফিগার করা হয়েছে, তবে আপনি পোষ্টগ্র্যাসকিএল সার্ভারটি গ্রহণ করার জন্য কনফিগার করেছেন MaxConnections=90। এগুলি বিরোধী সেটিংস বলে মনে হচ্ছে। বাড়ানোর চেষ্টা করুন MaxConnections=120

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


168

নিম্নলিখিত ত্রুটির ব্যাখ্যা:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

সারসংক্ষেপ:

আপনি ডাটাবেসে সংযোগের অনুমোদিত সীমা ছাড়িয়েও বেশি খোলেন। আপনি এই জাতীয় কিছু দৌড়েছিলেন: Connection conn = myconn.Open();একটি লুপের অভ্যন্তরে, এবং চালাতে ভুলে গেছেন conn.close();। কেবল আপনার শ্রেণি ধ্বংস হয়ে গেছে এবং সংগ্রহ করা আবর্জনা ডাটাবেসের সাথে সংযোগটি প্রকাশ করে না। এর দ্রুততম সমাধানটি হ'ল আপনার সাথে নিম্নলিখিত কোডটি রয়েছে তা নিশ্চিত করা যে কোনও শ্রেণি সংযোগ তৈরি করে:

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  

যে কোডটি আপনি কোনও সংযোগ তৈরি করেন সেখানে সেই কোডটি রাখুন। তারপরে যখন আপনার শ্রেণি আবর্জনা সংগ্রহ করা হবে, তখন আপনার সংযোগটি ছেড়ে দেওয়া হবে।

পোস্টগ্র্যাসিকেল সর্বাধিক সংযোগ অনুমোদিত হওয়ার জন্য এই এসকিউএল চালান:

show max_connections;

ডিফল্টটি 100 হয় good ভাল হার্ডওয়ারের পোস্টগ্রিএসকিউএল একসাথে কয়েকশ সংযোগ সমর্থন করতে পারে। আপনি যদি হাজার হাজার থাকতে চান তবে আপনার সংযোগের ওভারহেড হ্রাস করতে সংযোগ পুলিং সফ্টওয়্যারটি ব্যবহার করা উচিত।

কে / কী / কখন / কোথায় আপনার সংযোগগুলি উন্মুক্ত করে রেখেছে তা একবার দেখুন:

SELECT * FROM pg_stat_activity;

বর্তমানে ব্যবহৃত সংযোগগুলির সংখ্যাটি হ'ল:

SELECT COUNT(*) from pg_stat_activity;

ডিবাগিং কৌশল

  1. আপনি প্রোগ্রামগুলিতে বিভিন্ন ব্যবহারকারীর নাম / পাসওয়ার্ড দিতে পারেন যা এটি কোনটি সংযোগ প্রকাশ করতে পারে না এবং এটি পরে কী পরিষ্কার করছে না তা জানতে pg_stat_activity দেখুন।

  2. সংযোগ তৈরি হতে না পারলে সম্পূর্ণ ব্যতিক্রম স্ট্যাক ট্রেস করুন এবং আপনি যেখানে নতুন তৈরি করবেন সেখানে কোডটি অনুসরণ করুন Connection, আপনি যে সংযোগটি তৈরি করেছেন সেখানে প্রতিটি কোড লাইন শেষ হয়ে গেছে তা নিশ্চিত করুনconnection.close();

সর্বোচ্চ_ সংযোগগুলি কীভাবে উচ্চতর সেট করবেন:

postgresql.conf এ সর্বাধিক সংযোগগুলি ডাটাবেস সার্ভারে একযোগে সংযোগগুলির সর্বাধিক সংখ্যক সেট করে।

  1. প্রথমে আপনার postgresql.conf ফাইলটি সন্ধান করুন
  2. এটি কোথায় আছে তা যদি আপনি না জানেন তবে স্ক্যুয়াল দিয়ে ডাটাবেসটি জিজ্ঞাসা করুন: SHOW config_file;
  3. আমার মধ্যে: /var/lib/pgsql/data/postgresql.conf
  4. রুট হিসাবে লগইন করুন এবং সেই ফাইলটি সম্পাদনা করুন।
  5. স্ট্রিংটির জন্য অনুসন্ধান করুন: "সর্বাধিক_সংযোগ"।
  6. আপনি দেখতে পাবেন যে একটি লাইন max_connections=100
  7. এই সংখ্যাটি বৃহত্তর সেট করুন, আপনার পোস্টগ্রেকসএল সংস্করণটির সীমা পরীক্ষা করুন।
  8. পরিবর্তনগুলি কার্যকর করতে postgresql ডাটাবেস পুনরায় চালু করুন।

সর্বাধিক সর্বোচ্চ_সংযোগগুলি কী?

এই প্রশ্নটি ব্যবহার করুন:

select min_val, max_val from pg_settings where name='max_connections';

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


4
কিছু লোক কেন 'ভুলে যায়'; এসকিউএল বিবৃতি পরে ?! একটি
টানাকে

@ কোডারভান্স আপনাকে মনোযোগ দিতে হবে আমি প্রায় যতদূর বলতে পারি যে কপি + পেস্ট না করে আপনার কমান্ডগুলি প্রতিলিপি করা উচিত।
এভিপ্রোগ্রামার

4

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

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}

আপনার কাজটি নিবিড় সংযোগ করার পরে:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}

11
সবসময় অবশেষে ব্লক সংযোগ বন্ধ করুন! অন্যথায় কোনও ত্রুটি দেখা দিলে সংযোগটি খোলা থাকে।
tine2k

1

আপত্তিজনক লাইনগুলি নিম্নলিখিত:

MaxConnections=90
InitialConnections=80

আপনি আরও সংযোগের জন্য মানগুলি বাড়িয়ে দিতে পারেন।


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

0

আপনাকে আপনার সমস্ত সংযোগগুলি বন্ধ করতে হবে উদাহরণস্বরূপ: আপনি যদি একটি অন্তর্ভুক্ত INTO বিবৃতি দেন তবে আপনাকে বিবৃতি এবং আপনার সংযোগটি এইভাবে বন্ধ করতে হবে:

statement.close();
Connexion.close():

এবং যদি আপনি একটি নির্বাচন বিবৃতি করেন তবে আপনার বিবৃতি, সংযোগ এবং ফলাফলটি এইভাবে বন্ধ করতে হবে:

resultset.close();
statement.close();
Connexion.close();

আমি এটি করেছি এবং এটি কাজ করে

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