হাইবারনেট ওপেনসেশন () বনাম গেটকন্টারসেশন ()


130

জেএসপি ওয়েব অ্যাপ্লিকেশনটিতে হাইবারনেট ব্যবহার সম্পর্কে আমার কিছু প্রশ্ন রয়েছে।

  1. এর মান কী হওয়া উচিত hibernate.current_session_context_class?

  2. তাহলে, নিম্নলিখিত বিবৃতিগুলির মধ্যে কোনটি ব্যবহার করা উচিত? এবং কেন?

     Session s = HibernateUtil.getSessionFactory().openSession();
     Session s = HibernateUtil.getSessionFactory().getCurrentSession()
    
  3. শেষ অবধি, কোনটি "ওয়েব অ্যাপ্লিকেশন অনুসারে একটি অধিবেশন" বা "অনুরোধ অনুসারে একটি সেশন" ভাল?

উত্তর:


145

এই ফোরাম পোস্টে ব্যাখ্যা হিসাবে , 1 এবং 2 সম্পর্কিত। যদি আপনি hibernate.current_session_context_classথ্রেডে সেট হয়ে থাকেন এবং তারপরে একটি সার্লেট ফিল্টারের মতো কিছু প্রয়োগ করে যা সেশনটি খোলে - তবে আপনি ব্যবহার করে সেই সেশনটি অন্য কোথাও অ্যাক্সেস করতে পারবেন SessionFactory.getCurrentSession()

SessionFactory.openSession()অপারেশনগুলি সম্পন্ন করার পরে আপনাকে সর্বদা একটি নতুন সেশন খুলতে হবে। SessionFactory.getCurrentSession()একটি প্রসঙ্গে আবদ্ধ একটি অধিবেশন ফিরিয়ে দেয় - আপনার এটি বন্ধ করার দরকার নেই।

আপনি যদি লেনদেন পরিচালনা করতে স্প্রিং বা ইজেবি ব্যবহার করে থাকেন তবে লেনদেনের সাথে সেশনগুলি খোলার / বন্ধ করার জন্য তাদের কনফিগার করতে পারেন।

আপনার কখনই ব্যবহার করা উচিত নয় one session per web app- সেশন কোনও থ্রেড নিরাপদ বস্তু নয় - একাধিক থ্রেড দ্বারা ভাগ করা যায় না। আপনার সর্বদা "প্রতি অনুরোধের জন্য একটি সেশন" বা "লেনদেনের জন্য একটি সেশন" ব্যবহার করা উচিত


আপনাকে অনেক ধন্যবাদ, @gkamal। আমি দস্তাবেজটিতে ওপেন সেশনটিতে কোডটি দেখছি । (আপনার লিঙ্কটি সেই দস্তাবেজের দিকে নির্দেশ করে)) লেখক ফিল্টারটি ব্যবহারের পরামর্শ দেন। তার ফিল্টার কোডে, তিনি কল করেন না openSession()বা করেন না close()। তিনি কেবল ডাকেন getCurrentSession()। সে সেট করে অনুমান current_session_contextকরতে thread। এখন আমার মনে হয় আমি বুঝতে পেরেছি getCurrentSession()। তবে আমার কখন ব্যবহার করা উচিত তা আমি জানি না openSession()
wannik

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

গেটকন্টারসেশন () ব্যবহার করছি; কারণ আমি শ্রোতার ক্ষেত্রে এটি আরম্ভ করেছি ফিল্টার নয় এটি আপনার দর্শন থেকে ঠিক; এমভিসি 2 জেএসপি সার্লেট ব্যবহার করছি
শরীফ

@gkamal - আমার সম্পর্কিত একটি প্রশ্ন আছে Sessions। আপনি কি দয়া করে এটিতে আমাকে সহায়তা করতে পারেন - stackoverflow.com/questions/23351083/… । আপনাকে ধন্যবাদ এবং চেনকুই।
এরান মোরাড 21

আইএমও, প্রতিটি থ্রেডের নিজস্ব অধিবেশন ধরে রাখা ভাল অনুশীলন, এবং কেবল একটি সেশন, তাই না?
কোডার্জ

31

যদি আমরা সেশনফ্যাক্টরি.ওপেনসেশন () সম্পর্কে কথা বলি

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

এবং যদি আমরা সেশনফ্যাক্টরি.গেটকারেন্টসেশন () সম্পর্কে কথা বলি

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

উপরের উত্তরটি ওয়েবপ্যাপে একক সেশন ব্যবহার না করার কথা বলে। এইভাবে আমি যদি ব্যবহার getCurrentSessionকরতে পারি তবে এটি একই তিলটিকে পুনরায় ব্যবহার করবে, তাই না?
পার্সেকার

9

openSession: আপনি যখন কল করবেন তখন SessionFactory.openSessionএটি সর্বদা একটি নতুন Sessionঅবজেক্ট তৈরি করে এবং আপনাকে দেয়।

আপনাকে এই সেশন অবজেক্টগুলিকে স্পষ্টভাবে ফ্লাশ এবং বন্ধ করতে হবে।

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

getCurrentSession: আপনি যখন কল করবেন তখন SessionFactory.getCurrentSessionএটি আপনাকে সেশন অবজেক্ট সরবরাহ করবে যা হাইবারনেট প্রসঙ্গে এবং অভ্যন্তরীণভাবে হাইবারনেট দ্বারা পরিচালিত। এটি লেনদেনের সুযোগে আবদ্ধ।

আপনি যখন কল করবেন তখন SessionFactory.getCurrentSessionএটি একটি নতুন তৈরি করে Sessionযদি এটি বিদ্যমান না থাকে, অন্যথায় একই সেশনটি ব্যবহার করুন যা বর্তমান হাইবারনেট প্রসঙ্গে রয়েছে। লেনদেন শেষ হলে এটি স্বয়ংক্রিয়ভাবে ফ্লাশ হয় এবং সেশনটি বন্ধ করে দেয়, সুতরাং আপনাকে বাহ্যিকভাবে এটি করার দরকার নেই।

আপনি যদি একক থ্রেডযুক্ত পরিবেশে হাইবারনেট ব্যবহার করছেন তবে আপনি ব্যবহার করতে পারবেন getCurrentSession, কারণ প্রতিবার একটি নতুন সেশন তৈরি করার তুলনায় এটি কার্য সম্পাদনে দ্রুততর।

পদ্ধতিটি ব্যবহারের জন্য আপনাকে হাইবারনেট সিএফজি.এক্সএমএলগুলিতে নিম্নলিখিত সম্পত্তি যুক্ত করতে হবে getCurrentSession:

<session-factory>
    <!--  Put other elements here -->
    <property name="hibernate.current_session_context_class">
          thread
    </property>
</session-factory>

কোনও অনুরোধ প্রতিটি অনুরোধের জন্য একটি নতুন থ্রেড খুলছে না? সুতরাং এটি যদি জাভা ওয়েব অ্যাপ হয় তবে এটি ইতিমধ্যে একক থ্রেডযুক্ত পরিবেশ নয়?
পার্সিকার

0
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Parameter            |                                openSession                                 |                                          getCurrentSession                                          |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session  creation    | Always open new session                                                    | It opens a new Session if not exists , else use same session which is in current hibernate context. |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Session close        | Need to close the session object once all the database operations are done | No need to close the session. Once the session factory is closed, this session object is closed.    |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Flush and close      | Need to explicity flush and close session objects                          | No need to flush and close sessions , since it is automatically taken by hibernate internally.      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Performance          | In single threaded environment , it is slower than getCurrentSession       | In single threaded environment , it is faster than openSession                                      |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+
| Configuration        | No need to configure any property to call this method                      | Need to configure additional property:                                                              |
|                      |                                                                            |  <property name=""hibernate.current_session_context_class"">thread</property>                       |
+----------------------+----------------------------------------------------------------------------+-----------------------------------------------------------------------------------------------------+

-6

সেশনফ্যাক্টরি: "ডাটাবেস প্রতি অ্যাপ্লিকেশন অনুযায়ী একটি সেশনফ্যাক্টরি" (যেমন, আপনি যদি আমাদের অ্যাপ্লিকেশনটিতে 3 টি ডাটাবেস ব্যবহার করেন তবে আপনাকে প্রতিটি ডিবিতে সেশনফ্যাক্টরি অবজেক্ট তৈরি করতে হবে, পুরোপুরি আপনাকে 3 সেশনফ্যাক্টরি তৈরি করতে হবে। অন্যথায় যদি আপনার কেবল একটি ডাটাবেস ওয়ান সেশনফ্যাক্টরি থাকে) যথেষ্ট)।

অধিবেশন: "একটি অনুরোধ-প্রতিক্রিয়া চক্রের জন্য একটি অধিবেশন"। অনুরোধ এলে আপনি সেশনটি খুলতে পারেন এবং অনুরোধ প্রক্রিয়া শেষ হওয়ার পরে আপনি সেশনটি বন্ধ করতে পারেন। দ্রষ্টব্য:-ওয়েব অ্যাপ্লিকেশনটির জন্য একটি সেশন ব্যবহার করবেন না।

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