স্কেল সংযোগটি "উন্মুক্ত / বন্ধ" বা উন্মুক্ত রাখবেন?


121

আমি আমার ব্যবসায়িক-যুক্তি স্থিতিশীল পদ্ধতি সহ সহজ স্ট্যাটিক ক্লাসে প্রয়োগ করেছি। এই প্রতিটি পদ্ধতির এসকিউএল সংযোগটি খোলা / বন্ধ করার সময় বলা হয়:

public static void DoSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();

        // ...

        connection.Close();
    }
}

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

//pass the connection object into the method
public static void DoSomething(string something, SqlConnection connection)
{
    bool openConn = (connection.State == ConnectionState.Open);
    if (!openConn)
    {
        connection.Open();
    }

    // ....

    if (openConn) 
    {
        connection.Close();
    }
}

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

পুনশ্চ. এটি একটি এএসপি.এনইটি অ্যাপ্লিকেশন - কেবল ওয়েব-অনুরোধের সময় সংযোগ বিদ্যমান। কোনও উইন-অ্যাপ বা পরিষেবা নয়।


1
কেবলমাত্র একটি পরামর্শ: সরাসরি সম্পত্তি DbConnection.StateChangeযাচাইয়ের পরিবর্তে সংযোগের রাজ্যের পরিবর্তনের পরিবর্তনগুলি (এবং স্থানীয়ভাবে সঞ্চয় করা যেতে পারে) পর্যবেক্ষণ করতে ইভেন্টটি ব্যবহার করুন DbConnection.State। এটি আপনার কর্মক্ষমতা ব্যয় সাশ্রয় করবে।
ডেস্ক্লোন

1
অনুপস্থিত একটি বিশদ হ'ল এই পদ্ধতিটি কীভাবে কোনও পৃষ্ঠার অনুরোধের অংশ। এটি কি কেবল একমাত্র পদ্ধতি বলা হয় বা এটি, যেমনটি আমি আমার প্রতিক্রিয়া ধরে নিয়েছি, পৃষ্ঠার উত্তরপর্বে অনেকগুলি পদ্ধতির একটিকে ডাকা হয়, এটি কোন উত্তরটি সঠিক তা প্রভাবিত করে;)
ডেভিড মার্টেনসন

ডেভিড - এর মতো প্রচুর পদ্ধতি বলা হচ্ছে :)
অ্যালেক্স

1
মামলায় শো নিষ্পত্তি বিশ্বাস অভাব: দেখুন stackoverflow.com/questions/1195829/... এবং এর দুটিই MSDN উদাহরণ msdn.microsoft.com/en-us/library/...
user2864740

উত্তর:


82

বিকল্পটি আঁকুন a

সংযোগ পুলিং আপনার বন্ধু।


37
আইএমএইচও - তার কাছাকাছি হওয়া উচিত নয়। নিষ্পত্তি এটি করবে।
রই নমির

2
@ রইনিমির আমি সংযোগটি বন্ধ করার জন্য কল চাই। বিশেষত একটি কোড বেসে নতুন এবং আগতদের জন্য। এটি আরও স্পষ্ট এবং পাঠযোগ্য।
এজেড

27
"শেডজেডস" "ব্যবহার" এবং ক্লোজ () উভয়ই ব্যবহার অবশেষে কেবলমাত্র নতুনদের জন্য বিভ্রান্তির কারণ হতে চলেছে। তারা "ব্যবহার" ব্যবহারের উদ্দেশ্য বুঝতে যাচ্ছে না। "ক্লোজ" ব্যবহার না করে তাদের "ব্যবহার" করার উদ্দেশ্য শেখান। যাতে তারা আরও ভালভাবে শিখতে পারেন এবং কোডের অন্যান্য অংশে তারা যা শিখেন তা প্রয়োগ করতে পারেন।
লুইস পেরেজ

1
"ওপেন ()" কল করা উচিত? আমি বর্তমানে এটি এর মতো ব্যবহার করছি: (var সং = getConnication ())}} পাবলিক এসকিএল কানেকশন গেট কানেকশন () new নতুন এসকিএল সংযোগ (_ সংযোগস্ট্রিং) ফিরে আসুন; }
গ্যান্ডার্স

79

প্রতিবার পদ্ধতি (ক) ব্যবহার করুন। আপনি যখন নিজের অ্যাপ্লিকেশনকে স্কেলিং শুরু করবেন, রাষ্ট্রটির সাথে যুক্ত যুক্তিটি আপনি যদি তা না করেন তবে আসল ব্যথা হয়ে যাবে।

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


33

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

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

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


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

8
@ ডেভিড মার্টেনসন - আপনি যখন এসএলএল সংযোগটি কল করবেন তখন সংযোগগুলি আসলে খোলা এবং বন্ধ হয় না pen এএসপি.এনইটি পুলটি থেকে সক্রিয় সংযোগগুলি পুনরায় ব্যবহার করে যখন সংযোগ স্ট্রিংটি পূর্বে ব্যবহৃত সংযোগ স্ট্রিংয়ের সাথে মেলে। এতে জড়িত ওভারহেডটি অনিবার্য, এবং অতিরিক্তভাবে, "এটি নিজে করুন" করার চেষ্টা করার অর্থ আপনাকে পরবর্তী প্রতিটি ব্যবহারের জন্য সংযোগটি নিশ্চিত করার সমস্ত পরিচালনীয় কাজ এখনও সক্রিয় রয়েছে বলে ধরে নিতে হবে, যা জটিলতা এবং ওভারহেড যুক্ত করে। সংযোগ পুলিংয়ের সাথে, সর্বোত্তম অনুশীলন হ'ল এটি প্রতিটি ব্যবহারের জন্য খুলতে এবং বন্ধ করা।
জেমি ট্রেওয়ার্গি

2
আমার সমস্ত শ্রদ্ধার সাথে, "সর্বদা সংযোগগুলি বন্ধ করুন" উত্তরটি খুব ভালভাবে খাপ খায় না ... আমি সেগুলি বন্ধ করি। প্রশ্ন হল - কখন।
অ্যালেক্স

@ ডেভিড মার্টেনসন "প্রতিটি পৃষ্ঠার জন্য একবার" ওভারসিম্লিফিক করা হয়েছে। আপনি ঠিক বলেছেন যে যদি একের পর এক কার্যকর করার জন্য আপনার কাছে বেশ কয়েকটি ডাটাবেস কমান্ড থাকে তবে আপনি এগুলি সম্পাদন করার সময় সংযোগটি উন্মুক্ত রাখতে পারেন। আপনি যদি বন্ধ করে আবার খোলেন তবে একটি ছোট্ট ওভারহেড থাকবে - সংযোগটি পুলের মধ্যে যাবে এবং এক মুহুর্ত পরে এটি থেকে পুনরুদ্ধার করা হবে।
কংক্রিট গ্যানেট

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

13

দাবি অস্বীকার: আমি জানি এটি পুরানো, তবে আমি এই সত্যটি প্রদর্শনের সহজ উপায় খুঁজে পেয়েছি, তাই আমি আমার দুটি সেন্টের মূল্য রাখছি।

যদি পুলিংটি সত্যিই দ্রুততর হতে চলেছে এই বিশ্বাস করতে আপনার যদি সমস্যা হয় তবে এটি চেষ্টা করে দেখুন:

নিম্নলিখিত কোথাও যুক্ত করুন:

using System.Diagnostics;
public static class TestExtensions
{
    public static void TimedOpen(this SqlConnection conn)
    {
        Stopwatch sw = Stopwatch.StartNew();
        conn.Open();
        Console.WriteLine(sw.Elapsed);
    }
}

এখন সমস্ত কল Open()সাথে প্রতিস্থাপন করুন TimedOpen()এবং আপনার প্রোগ্রাম চালান। এখন, আপনার প্রতিটি স্বতন্ত্র সংযোগের স্ট্রিংয়ের জন্য, কনসোল (আউটপুট) উইন্ডোটিতে একটি দীর্ঘ দীর্ঘ চলমান খোলা থাকবে এবং খুব দ্রুত একটি গোছা খোলা হবে।

আপনি যদি তাদের লেবেল করতে চান তবে new StackTrace(true).GetFrame(1) +আপনি কলটিতে যোগ করতে পারেন WriteLine


9

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

এছাড়াও আপনার ক্ষেত্রে ডিবি সার্ভারে সমান্তরাল সংযোগের সীমাবদ্ধতাগুলির ক্ষেত্রে আপনার মনে রাখা উচিত - আপনার সংযোগগুলি খুব সংক্ষিপ্ত করে তোলা প্রয়োজন make

সংযোগ পুল আপনাকে সংযোগের স্থিতি পরীক্ষা থেকে মুক্তি দেয় - খালি খুলুন, ব্যবহার করুন এবং অবিলম্বে এগুলি বন্ধ করুন।


হ্যাঁ, সংযোগটি সংযোগ নয় - অর্থাত্ ডিবি সংযোগটি শারীরিক সংযোগ নয়। ডিবি সংযোগ একটি। নেট ক্লাস যা অন্তর্নিহিত শারীরিক সংযোগটি পরিচালনা করার জন্য পদ্ধতি এবং বৈশিষ্ট্য সরবরাহ করে।
কংক্রিট গ্যানেট

দুর্ভাগ্যক্রমে এটি তাত্ক্ষণিকভাবে স্পষ্ট ছিল না যে এটি সমস্ত স্পষ্টভাবে সম্পন্ন হয়েছিল, তবে ডকুমেন্টেশনগুলি এতে বিশদভাবে বর্ণনা করেছে। ডকস.মাইক্রোসফট.ওন
অস্টিন সালগাত

2

সাধারণত প্রতিটি লেনদেনের জন্য আপনার একটি সংযোগ রাখা উচিত (সমান্তরাল গণনা নেই)

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

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

কেন আবেদনটিতে কেবল একটি সংযোগ রাখবেন না

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

আরও একটি সমস্যা হ'ল আপনার অ্যাপ্লিকেশনটিতে সর্বদা একটি সংযোগ থাকবে যদিও আপনার ব্যবহারকারী এটি খোলার পরেও কোনও ক্রিয়াকলাপ নেই many যদি অনেক ব্যবহারকারী আপনার অ্যাপ্লিকেশনটি খোলেন, ডিবি সার্ভারটি শীঘ্রই এর সমস্ত সংযোগ উত্সের জন্য ব্যয় করবে যখন আপনার ব্যবহারকারীরা করেন নি কিছু.

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