2010-03-07 16 views
9

में मैंने भाग्य के साथ इस पर थोड़ा सा शोध किया है, लेकिन सभी उत्तरों में कॉन्फ़िगरेशन फ़ाइल में सत्र संदर्भ सेटिंग्स की ओर इशारा करने की प्रवृत्ति है। अजीब बात यह है कि मुझे पहली बार पृष्ठ पर क्लिक करने के लिए एक सत्र कनेक्शन मिलता है (और इसलिए, एक सफल परिणाम सेट), लेकिन फिर जब मैं पुनः लोड करता हूं तो मुझे निम्न अपवाद मिलता है: org.hibernate.SessionException: सत्र बंद है!org.hibernate के साथ कोई समस्या है। सत्र अपवाद: सत्र बंद है! हाइबरनेट

<property name="hibernate.show_sql">false</property> 
<property name="hibernate.dialect">org.hibernate.dialect.SQLServerDialect</property>   
<property name="hibernate.current_session_context_class">thread</property> 
<property name="hibernate.cache.provider_class">org.hibernate.cache.NoCacheProvider</property> 
<property name="hibernate.cache.use_query_cache">false</property> 
<property name="hibernate.cache.use_minimal_puts">false</property> 

यहाँ एक फोन का एक उदाहरण है मुझे लगता है कि स्थिति मैं ऊपर वर्णित का उत्पादन करते हैं:

यहाँ मेरी config सेटिंग्स है कि कनेक्शन स्ट्रिंग DB नहीं कर रहे हैं से संबंधित हैं।

public T get(int id) { 
    session.beginTransaction(); 
    T type; 
    try { 
     type = getTypeClass().cast(session.get(getTypeClass(), id)); 
    } catch (ClassCastException classCastException) { 
     throw new ClassCastException(classCastException.getMessage()); 
    } 
    session.getTransaction().commit(); 
    return type; 
} 

सत्र चर संदर्भ एक स्थिर क्षेत्र में है जिसमें वर्तमान सत्र है। सभी सत्र कनेक्शन विवरण पाठ्यपुस्तक संदर्भ मैनुअल हैं।

import org.hibernate.SessionFactory; 
import org.hibernate.cfg.Configuration; 

public class HibernateSessionFactoryUtil { 

    private static final SessionFactory sessionFactory = buildSessionFactory(); 

    private static SessionFactory buildSessionFactory() { 
     try { 
      return new Configuration().configure().buildSessionFactory(); 
     } catch (Throwable ex) { 
      System.err.println("Initial SessionFactory creation failed." + ex); 
      throw new ExceptionInInitializerError(ex); 
     } 
    } 

    public static SessionFactory getSessionFactory() { 
     return sessionFactory; 
    } 
} 
+0

क्या आपके पास सत्र को बंद/मारने के लिए कोई कार्यान्वयन है? –

उत्तर

8

जब आप sessionFactory.getCurrentSession() के साथ एक सत्र मिलता है, सत्र प्लावित है और जब लेन-देन के लिए प्रतिबद्ध है (इस बारे में अधिक जानकारी के लिए Sessions and transactions देखें) अपने आप बंद: उदाहरण के लिए, यहाँ मेरी हाइबरनेट सत्र उपयोगिता है। तो, मुझे यहां संदेह है कि 1. आप सभी के लिए सत्र प्राप्त करते हैं (यह समझाएगा कि पहला कॉल क्यों काम करता है और क्यों बाद में कॉल विफल हो जाते हैं) जो गलत है और 2. आप सत्र-प्रति-ऑपरेशन एंटी- पैटर्न जो भी बदतर है।

एक वेब अनुप्रयोग में, आप एक सत्र प्रति अनुरोध रणनीति है कि "एक ही सत्र और एक एकल डाटाबेस लेनदेन एक विशेष अनुरोध घटना के प्रसंस्करण लागू" जिसका अर्थ है का उपयोग करना चाहिए। फिर, Sessions and transactions दस्तावेज़ देखें।

और यदि आप अपने डेटा एक्सेस कोड से लेनदेन की सीमा को हटाना चाहते हैं, तो आप प्रत्येक अनुरोध की शुरुआत में डेटाबेस लेनदेन शुरू करने के लिए interceptor का उपयोग कर सकते हैं और अनुरोध के अंत में इसे प्रतिबद्ध कर सकते हैं। इस पैटर्न के कार्यान्वयन के लिए Open Session in View पर एक नज़र डालें (लाभ का प्रदर्शन करने वाले नमूना डीएओ के साथ)।

+0

इन सभी के साथ समस्या यह है: 1) संदर्भ दस्तावेज एक मूल उदाहरण का उपयोग करता है जिसे वे तुरंत बताते हैं कि उत्पादन परिदृश्यों के लिए गलत है (सामान्य परिदृश्यों के बारे में वांछित होने के लिए छोड़कर)। 2) लेनदेन लगभग हमेशा परिचालन होते हैं, लेकिन दस्तावेज प्रति सत्र प्रति सत्र एक लेनदेन दिखाता है। चूंकि कोई भी पूरे अनुरोध के दायरे के लिए एक लेनदेन का उपयोग कब करता है? अनुरोध के दौरान आपके पास तीन अलग-अलग लेन-देन हो सकते हैं जिन्हें आपको वापस रोल करने की आवश्यकता है। यह एक ऐसा क्षेत्र है जहां हाइबरनेट को दस्तावेज़ीकरण के साथ बेहतर काम करने की आवश्यकता है। –

+0

अंत में समस्या से संबंधित था कि मैं सत्र चर संदर्भ को कैसे प्रबंधित कर रहा था। मैं शायद एक फ़िल्टर में खुले/बंद सत्र हैंडलिंग को स्थानांतरित कर दूंगा, और उसके बाद प्रत्येक ऑपरेशन (या संचालन के सेट) के व्यक्तिगत लेन-देन का प्रबंधन करूंगा। –

+0

@ hal10001 मैं इस बात से सहमत नहीं हूं कि लेन-देन लगभग हमेशा परिचालित होते हैं, आप ** ** अनुरोध नहीं करते हैं कि "अनुरोध का आधा" (सत्र-प्रति-ऑपरेशन को कुछ भी नहीं के लिए विरोधी पैटर्न कहा जाता है) प्रति अनुरोध एक लेनदेन जाने का रास्ता है। –

संबंधित मुद्दे