হাইবারনেট অলস-লোড অ্যাপ্লিকেশন ডিজাইন


87

আমি বসন্ত কাঠামোর সাথে হাইবারনেট ব্যবহার করার প্রবণতা এবং এটি ঘোষণামূলক লেনদেনের সীমাবদ্ধতা ক্ষমতাগুলি (যেমন, @ ট্রান্সজেকশনাল )।

যেমনটি আমরা সবাই জানি, হাইবারনেট যতটা সম্ভব আক্রমণাত্মক এবং স্বচ্ছ হতে চেষ্টা করে , তবে সম্পর্ক নিযুক্ত করার সময় এটি কিছুটা চ্যালেঞ্জিং প্রমাণ করে lazy-loaded


স্বচ্ছতার বিভিন্ন স্তরের সাথে আমি বেশ কয়েকটি ডিজাইনের বিকল্প দেখতে পাচ্ছি।

  1. সম্পর্কগুলি অলস বোঝা না করে তৈরি করুন (যেমন, fetchType=FetchType.EAGER)
    • এটি অলস লোডিংয়ের সম্পূর্ণ ধারণাটিকে লঙ্ঘন করে ..
  2. ব্যবহার করে সংগ্রহ শুরু করুন Hibernate.initialize(proxyObj);
    • এটি ডিএওতে তুলনামূলকভাবে উচ্চ সংযুক্তিকে বোঝায়
    • যদিও আমরা একটি ইন্টারফেসের সাথে সংজ্ঞা দিতে পারি initialize, অন্য বাস্তবায়নগুলি কোনও সমতুল্য সরবরাহের গ্যারান্টিযুক্ত নয়।
  3. ক্রমাগত করার লেনদেনের আচরণ যোগ করুন Model(হয় ব্যবহার বস্তু নিজেদের গতিশীল প্রক্সি বা @Transactional)
    • আমি গতিশীল প্রক্সি পদ্ধতির চেষ্টা করি নি, যদিও আমি কখনও মনে করি নি যে তারা অবিচ্ছিন্ন অবজেক্টগুলিতে নিজেরাই @ ট্রানজেকশনাল কাজ করবে। সম্ভবত সেই হাইবারনেটের কারণে প্রক্সির অপারেশন চলছে।
    • যখন লেনদেন আসলে ঘটে থাকে তখন নিয়ন্ত্রণের ক্ষতি
  4. অলস / অলস API উভয়ই সরবরাহ করুন, যেমন, loadData()এবংloadDataWithDeps()
    • অ্যাপ্লিকেশনটিকে কখন কখন নিয়মিত নিয়োগ করতে হয় তা জানাতে বাধ্য করে, আবার শক্ত করে মিলিত হয়
    • পদ্ধতি ওভারফ্লো,, loadDataWithA()....,loadDataWithX()
  5. নির্ভরতাগুলির জন্য অনুসন্ধানের জন্য বল প্রয়োগ করুন, যেমন কেবলমাত্র byId()ক্রিয়াকলাপ সরবরাহ করে providing
    • প্রচুর নন-অবজেক্ট ভিত্তিক রুটিনগুলির প্রয়োজন, যেমন findZzzById(zid), এবং তার getYyyIds(zid)পরিবর্তে insteadz.getY()
    • লেনদেনের মধ্যে যদি একটি বৃহত প্রসেসিং ওভারহেড থাকে তবে এটি প্রতিটি একেকটি সংগ্রহে একের পর এক আনতে কার্যকর হতে পারে।
  6. এর অংশ করতে আবেদন @Transactional শুধুমাত্র পরিবর্তে দাও
    • নেস্টেড লেনদেনের সম্ভাব্য বিবেচনা
    • লেনদেন পরিচালনার জন্য অভিযোজিত রুটিনগুলির প্রয়োজন (যেমন, যথেষ্ট পরিমাণে ছোট)
    • ছোট প্রোগ্রাম্যাটিক প্রভাব, যদিও বড় লেনদেনের ফলাফল হতে পারে
  7. ডায়নামিক আনার জন্য প্রোফাইলগুলি সরবরাহ করুন , যেমন,loadData(id, fetchProfile);
    • অ্যাপ্লিকেশনগুলি অবশ্যই কখন প্রোফাইলটি ব্যবহার করবে তা অবশ্যই জানতে হবে
  8. এওপি ধরণের লেনদেন, উদাহরণস্বরূপ, বিরতিমূলক ক্রিয়াকলাপ এবং প্রয়োজনে লেনদেন সম্পাদন
    • বাইট-কোড ম্যানিপুলেশন বা প্রক্সি ব্যবহারের প্রয়োজন
    • লেনদেন সম্পাদিত হলে নিয়ন্ত্রণের ক্ষতি
    • কালো যাদু, বরাবরের মতো :)

আমি কোন বিকল্প মিস করেছি?


lazy-loadedআপনার অ্যাপ্লিকেশন ডিজাইনে সম্পর্কের প্রভাব হ্রাস করার চেষ্টা করার সময় আপনার পছন্দের পদ্ধতির কোনটি ?

(ওহ, এবং জন্য দুঃখিত শেষ পরীক্ষিত ওয়েবসাইট )


বিকল্প 2 এবং 5 বিকল্পের জন্য উদাহরণ: m-bodyedy.blogspot.ch/2010/03/…
অ্যাড্রিয়েন

আপনি দয়া করে বিকল্প 4 এর জন্য একটি উদাহরণ সরবরাহ করতে পারেন?
ডিগ্রিাইটডিসি

উত্তর:


26

যেমনটি আমরা সবাই জানি, হাইবারনেট যতটা সম্ভব আক্রমণাত্মক এবং স্বচ্ছ হওয়ার চেষ্টা করে

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

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

এই দৃষ্টিকোণ থেকে, সমাধানগুলি যেগুলি এই উদ্দেশ্যগুলি স্পষ্টভাবে প্রকাশ করে (যথা, 2, 4 এবং 7) যুক্তিসঙ্গত দেখায় এবং স্বচ্ছতার অভাবে ভোগ না করে।


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

আইএমএইচও: পুরোপুরি সঠিক উত্তর। প্রকৃতপক্ষে, এটি একটি কল্পকাহিনী। বিটিডাব্লু: আমার ভোটটি 4 এবং 7 বিকল্পের জন্য হবে (বা
ওআরএম

7

আমি নিশ্চিত নই যে আপনি কোন সমস্যার (অলসতার কারণে) ইঙ্গিত দিচ্ছেন তবে আমার পক্ষে সবচেয়ে বড় ব্যথা হ'ল আমার নিজের অ্যাপ্লিকেশন ক্যাশে সেশন প্রসঙ্গ হারাতে না পারা। সাধারণ ক্ষেত্রে:

  • বস্তুটি fooলোড করা হয় এবং একটি মানচিত্রে রাখা হয়;
  • অন্য একটি থ্রেড মানচিত্র থেকে এই বস্তুটি নেয় এবং কল করে foo.getBar()(এমন কিছু যা আগে কখনও বলা হয় নি এবং অলস মূল্যায়ন করা হয়);
  • বুম!

সুতরাং, এটিকে সমাধান করার জন্য আমাদের অনেকগুলি বিধি রয়েছে:

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

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


আপনার উত্তর দেওয়ার জন্য ধন্যবাদ. ক্ষতি transparencyহ'ল অলস জিনিসগুলি লোড করার বিষয়ে যত্ন নিতে অ্যাপ্লিকেশনটিকে বাধ্য করা থেকে। যদি সমস্ত কিছু উত্সাহ সহকারে আনা হয় তবে অ্যাপ্লিকেশনটি অজানা থাকতে পারে যে অবজেক্টগুলি কোনও ডাটাবেসে অবিচল থাকে কি না, যেহেতু Foo.getBar()সর্বদা সফল হবে। > when passing objects between threads, pass IDs, হ্যাঁ, এটি # 5 এর সাথে মিলবে।
জোহান সিজবার্গ

3

খুব সাধারণ প্যাটার্ন হ'ল ওপেনএটিটি ম্যানেজারআইভিভিউ ফিল্টার ব্যবহার করা যদি আপনি ওয়েব অ্যাপ্লিকেশন তৈরি করে থাকেন।

যদি আপনি কোনও পরিষেবা তৈরি করে থাকেন তবে আমি ডিএও-র পরিবর্তে পরিষেবার পাবলিক পদ্ধতিতে টিএক্স খুলতে পারি, প্রায়শই প্রায়শই একটি পদ্ধতির বেশ কয়েকটি সত্ত্বা অর্জন বা আপডেট করার প্রয়োজন হয়।

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


4
আমি তোমাদের বলতে চেয়েছিলেন অনুমান: একটি খুব সাধারণ antipattern ... । যদিও আমি পরিষেবা স্তরে টিএক্স খোলার সাথে একমত হব, তবে এর ব্যবহার OSIVএখনও একটি প্রতিরোধ ব্যবস্থা এবং ব্যতিক্রম বা পারফরম্যান্স অবক্ষয়ের সাথে নিখুঁতভাবে আচরণ করতে অক্ষমতার মতো গুরুতর সমস্যার দিকে পরিচালিত করে। সংক্ষিপ্তসার হিসাবে : আইএমএইচও ওএসআইভি হ'ল একটি সহজ সমাধান, তবে কেবল খেলনা-প্রকল্পগুলির জন্যই ভাল।
জি ডেমেকি
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.