ডাটাবেস সংযোগ - সেগুলি পরামিতি হিসাবে পাস করা উচিত?


11

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

আমি জানি যে অধ্যবসায় করার জন্য কিছু ওআরএম সরঞ্জাম রয়েছে তবে আমরা এখনও এটিতে যেতে পারি না ..

কোন প্রতিক্রিয়া স্বাগত জানাই, ধন্যবাদ।


আপনি কোন ধরণের সমস্যার কথা উল্লেখ করছেন? কার এই সন্দেহ? (আপনি নয়, আমি ধরে নিই।)
গ্রেগ হিউগিল

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

উত্তর:


8

হ্যাঁ কোনও সংযোগের বাইরে যাওয়া নিরাপদ। আপনি কোনও বহিরাগত নিয়ন্ত্রণকারী ব্লকে সংযোগটি পরিচালনা করেন। এটি সম্পর্কে নিরাপদ কিছুই নেই।

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

সি ++ এ, আপনি যদি স্ট্যাকের উপর বরাদ্দ করেন বা স্মার্ট পয়েন্টার ব্যবহার করেন তবে আপনি আরআইআই দ্বারা সুরক্ষিত। সি # তে একটি কঠোর নিয়ম করুন যে সমস্ত নিষ্পত্তিযোগ্য বস্তু (যেমন সংযোগগুলি) "ব্যবহার" ব্লকে ঘোষণা করা হবে। জাভাতে চেষ্টা করুন পরিশেষে যুক্তি দিয়ে পরিষ্কার করুন। এটি নিশ্চিত করতে সমস্ত ডেটা স্তর কোডের কোড পর্যালোচনা করুন।

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

মনে করুন আমাদের কাছে অনেকগুলি ফুবার () ক্রিয়া রয়েছে যা পারমাণবিক লেনদেন হিসাবে বিভিন্ন উপায়ে একত্রিত হতে পারে।

//example in C#
//outer controlling block handles clean up via scoping with "using" blocks.
using (IDbConnection conn = getConn())
{
    conn.Open();
    using (IDbTransaction tran = conn.BeginTransaction())
    {
        try
        {//inner foobar actions just do their thing. They don't need to clean up.
            foobar1(tran);
            foobar2(tran);
            foobar3(tran);
            tran.Commit();
        }
        catch (Exception ex)
        { tran.Rollback(); }
    }
}//connection is returned to the pool automatically

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

BTW। প্রথম শ্রেণীর ফাংশনগুলির জন্য আপনার ভাষার সমর্থনের উপর নির্ভর করে আপনি ফোবার () ক্রিয়াগুলির তালিকাতে নিতে পারেন। সুতরাং একটি ফাংশন ক্রিয়াকলাপের সমস্ত অনুমতি হ্যান্ডেল করতে পারে। প্রতিটি অনুক্রমের জন্য বাইরের নিয়ন্ত্রক ব্লকের সদৃশতা দূর করা।


এটিকে উত্তর হিসাবে চিহ্নিত করা পরিস্থিতি সম্পর্কে আমাকে আরও ধারণা দেয়
ipohfly

6

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

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

স্প্রিং জেডিবিসি এট আল আপনার জন্য এই ধরণের আচরণ সম্পাদনের otehr উদাহরণ


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

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

2

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

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

এই সমস্তগুলি ডাটাবেস, সংযোগ, বিবৃতি, ফলাফল সেট এবং তাদের জীবনচক্রকে সম্মান না করেই ডেকে আনে।

এটি এড়াতে, এমন বিদ্যমান নিদর্শন এবং কাঠামো রয়েছে যা ডেটাবেসগুলির সাথে আরও সুন্দরভাবে খেলেন এবং তাদের মধ্যে সীমাবদ্ধ ক্লাসগুলি থেকে বেরিয়ে আসা দরকার ডাটাবেসের জিনিসগুলির মধ্যে নেই Data তথ্য ভিতরে যায়, ডেটা চলে যায়, ডাটাবেস রাখে।


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

এই বিদ্যমান কিছু নিদর্শন এবং কাঠামোর নাম কি?
ড্যানিয়েল ক্যাপলান

@tieTYT প্রাথমিক যেগুলি সামনে আসে সেগুলি হ'ল ডেটা অ্যাক্সেস অবজেক্ট যা বাকী অ্যাপ্লিকেশন থেকে ডাটাবেসটি আড়াল করার কাজ করে। ডেটা অ্যাক্সেস লেয়ার এবং অবজেক্ট-রিলেশনাল ম্যাপিং

আমি যখন এই নিদর্শনগুলির কথা ভাবি তখন আমি অনুভব করি যে সে কী জিজ্ঞাসা করছে তার চেয়ে বিমূর্ততার উচ্চ স্তরে at ধরা যাক আপনি Rootএকটি দাও থেকে একটি উপায় পেয়েছেন । তবে আপনি বুঝতে পারবেন যে আপনি এটির সাথে Nodeপুরো Rootবস্তুটি না টান দিয়ে একটি উপায়ও পেতে চান । আপনি কীভাবে দাও কোডটি দাও Rootকোডকে কল করবেন Node(অর্থাত: পুনঃব্যবহার করুন), তবে নিশ্চিত করুন যে Nodeদাও যখন Nodeডেকে ডাকা হয় তখনই সংযোগটি বন্ধ করে দেয় এবং যখন দাও বলা হয় তখন সংযোগটি খোলা রাখে Root?
ড্যানিয়েল ক্যাপলান

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

2

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

final Connection cnx = dataSource.getConnection();
try {
    // Operations using the instance
} finally {
    cnx.close();
}

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

2018-03-29 সম্পাদনা করুন: নীচের মন্তব্যে ব্যবহারকারী 1156544 দ্বারা নির্দেশিত অনুসারে, জাভা 7 দিয়ে শুরু করে-সংস্থান-ব্যবহারের চেষ্টা করে ব্যবহার করা উচিত। এটি ব্যবহার করে, আমি আমার প্রাথমিক উত্তরে প্রদত্ত কোড প্যাটার্নটি এভাবে সরল করা যেতে পারে:

try (final Connection cnx = dataSource.getConnection()) {
    // Operations using the instance
}

1
আমি অনুরূপ কিছু ব্যবহার। আমার ফাংশন doInTransaction (DbTask টাস্ক) রয়েছে, যেখানে সংযোগের প্যারামিটারের সাথে পদ্ধতিতে DbTask আমার ইন্টারফেস। doInTransaction সংযোগ প্রাপ্ত করে, কল করে টাস্ক এবং কমিট (বা ব্যতিক্রম হলে রোলব্যাক) এবং সেই সংযোগটি বন্ধ করে।
ব্যবহারকারী470365

আপনার উদাহরণ থেকে বিচার করে, এর অর্থ কি ডেটাসোর্স অবজেক্টটি একটি সিঙ্গলটন?
ipohfly

@ আইপোফ্লাই প্রকৃতপক্ষে আমার উচিত ছিল সেই বস্তুর নাম dataSourceনা দিয়ে DataSource(আমি এই বিষয়ে আমার উত্তরটি ঠিক করব)। যে বস্তুর সঠিক ধরণ হবে javax.sql.DataSource। পুরানো কোডে আমি আমার অ্যাপ্লিকেশনগুলির মধ্যে সমস্ত উপলব্ধ ডেটা সোর্স পরিচালনা করতে একটি সিঙ্গলটন ব্যবহার করতাম। আমার ডিএওগুলিকে সে সম্পর্কে জানতে হবে না, কারণ DataSourceনির্ভরতা ইনজেকশনের মাধ্যমে উদাহরণটি সরবরাহ করা হয়।
কেভিনলএইচ

আপনি যদি এই স্কিমাটি ব্যবহার করেন তবে রিসোর্স সহ আরও ভাল ব্যবহার করুন
ব্যবহারকারীর 1156544

ফিরে যখন আমি উত্তর দিয়েছি, আমি এখনও জাভা 7. ব্যবহার করিনি But তবে আপনি ঠিক বলেছেন যে এই দিনগুলিতে এটি পছন্দসই উপায় হওয়া উচিত। আমি আপনার পরামর্শ অন্তর্ভুক্ত আমার উত্তর আপডেট করব।
কেভিনএলএইচ

0

আপনি প্রয়োজন হিসাবে পেতে পারেন যা একটি একক ব্যবহার করার চেয়ে জিনিস এইভাবে করার একটি বাণিজ্য আছে। আমি অতীতে দু'ভাবেই কাজ করেছি।

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

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

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