2009-12-07 11 views
6

मैं निम्नलिखित घटकों के साथ एक आवेदन चल रहा हूँ:, 6.1 था JTA, हाइबरनेट, स्प्रिंग के साथ जेपीए: डेटा पुनर्प्राप्ति समस्या

  • ओरेकल 9i
  • WS साथ 6.1.0.23 था और EJB3 पैक
  • सुविधाएँ
  • हाइबरनेट 3.3.2.GA प्रदाता के रूप में के लिए
  • स्प्रिंग लेन-देन प्रबंधक (हाइबरनेट-EntityManager 3.4.0 के साथ) के साथ जेपीए था: UowTransactionManager (वसंत 2.5.6) प्रवाह से प्रबंधित दृढ़ता के साथ
  • स्प्रिंग webflow (2.0। 8), यानी इकाई प्रबंधक को http सत्र में क्रमबद्ध किया जाता है, और प्रत्येक अनुरोध पर पुनर्स्थापित किया जाता है।

प्रत्येक अनुरोध सेवा परत (वसंत के @Transactional साथ एनोटेट) करने के लिए वेब नियंत्रक से जा रहा है, मैंने देखा है प्रत्येक SQL क्वेरी कि हाइबरनेट लेन-देन के अंदर सेवा मंगलाचरण के दौरान प्रदर्शन करती है के लिए, एक नया डेटा स्रोत connnection है कि जेनडी डेटासोर्स से हाइबरनेट के कनेक्शनप्रोवाइडर द्वारा अनुरोध किया गया, जब तक डेटासोर्स मुफ्त कनेक्शन से बाहर नहीं हो जाता और आखिरकार लटकता है।

यहाँ विन्यास के हिस्से हैं:

  1. स्प्रिंग:

    <tx:annotation-driven /> 
    <context:component-scan base-package="org.home.myapp" /> 
    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/DS" resource-ref="true"/> 
    <bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager"/> 
    <bean id="EMF" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
        <property name="dataSource" ref="dataSource"/> 
        <property name="jpaVendorAdapter"> 
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
        </property> 
    </bean> 
    
  2. persistence.xml

    <persistence-unit name="persistence" transaction-type="JTA"> 
        <properties> 
        <property name="hibernate.archive.autodetection" value="class"/> 
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle9iDialect"/> 
        <property name="hibernate.current_session_context_class" value="jta"/> 
        <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
        <property name="hibernate.format_sql" value="true"/> 
        <property name="hibernate.show_sql" value="true"/> 
        <property name="hibernate.default_batch_fetch_size" value="20"/> 
        <property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.WebSphereExtendedJTATransactionLookup"/> 
        </properties> 
    </persistence-unit> 
    
  3. सेवा

    @Transactional(readOnly=true) @Service 
    public class MyServiceImpl implements MyService { 
        @Autowired MyDao dao; 
        public void getSomething() { 
        dao.findSomething(); 
        } 
    } 
    
  4. डीएओ

    @Repository 
    public class MyDaoJap implements MyDao { 
        @PersistenceContext EntityManager em; 
        public void findSomething() { 
        em.find(...); 
        } 
    } 
    

नोट लेन-देन है, जो प्रवाह के हठ के लिए सामान्य है केवल पढ़ने के लिए: केवल पिछले संक्रमण (प्रतिबद्ध के साथ सच =) एक गैर केवल पढ़ने के लिए लेन-देन संबंधी विधि invokes। केवल पढ़ने के लिए ध्वज स्वचालित रूप से HUernernate फ्लश मोड को मैन्युअल में बदल देता है।

कुछ डिबग करते समय, मैंने देखा है निम्नलिखित:

  • UOW लेनदेन प्रबंधक सही ढंग से सेवा के अवरोधन श्रृंखला है, जो पता चलता है कि एक सौदे सक्रिय है
  • हाइबरनेट एक कनेक्शन के लिए पूछता है में शुरू हो जाती है ईएमएफ में इंजेक्शन वाले कच्चे डेटासोर्स पर DataSource.getConnection() का आह्वान करके; कनेक्शन प्राप्त करने की रणनीति हाइबरनेट के इंजेक्शनडेटासोर्सकनेक्शनप्रोवाइडर से है, और यह वर्ग WAS डेटासोर्स का संदर्भ देता है (एक प्रॉक्सी नहीं जो सक्रिय लेनदेन से अवगत है, या ऐसे)।

मुझे लगता है कि समस्या इस दूसरी बिंदु में है, लेकिन मुझे मेरी कॉन्फ़िगरेशन में कोई त्रुटि नहीं मिल रही है। क्या कोई मदद कर सकता है?

आपकी मदद के लिए धन्यवाद।

उत्तर

2

हमारे config

  • हाइबरनेट प्रोप से कुछ जंगली अनुमान -scope >
  • वसंत sessionFactory config - useTransactionAwareDataSource = "true"

यह

+0

दूसरा सही उत्तर है। डेटासोर्स का साझा करने का दायरा अछूत था। बहुत बहुत धन्यवाद। – Gaetan

0

मुझे लगता है कि (और उम्मीद है) कि आपकी समस्या इस तथ्य से उत्पन्न होती है कि डेटा स्रोत प्रॉपर्टी का उपयोग करके यह "nonJtaDataSource" पर डिफ़ॉल्ट होता है।डिफ़ॉल्ट (सरल) कॉन्फ़िगरेशन वास्तव में निम्न ग्रेड लेनदेन प्रणाली (टोमकैट/एसई) के लिए अनुकूलित किया गया है और जितना अधिक कट्टर ढेर आप उपयोग कर रहे हैं।

आपको एक जेटीए डेटासोर्स रखने के लिए इकाई प्रबंधक कारखाने को कॉन्फ़िगर करने की आवश्यकता होगी। जिस तरह से मैंने यह किया है वह अपना खुद का JtaPersistenceUnitPostProcessor बनाना है जहां मैं इसे स्थापित कर सकता हूं।

ऐसा करने से मैं एक जेटीडेटासोर्स का उपयोग करने के लिए ईएमएफ सेट करने में सक्षम था, मुझे यकीन नहीं है कि ऐसा करने का एक बेहतर तरीका है या नहीं। आप बस एक पीओसी के रूप में अपने persistence.xml के लिए jta डेटासॉर संदर्भ जोड़ सकते हैं। hibernate.connection.release_mode = after_statement

  • web.xml संसाधन रेफरी डेटा स्रोत config - - < रेस साझा करने संबंधी गुंजाइश > साझा करने योग्य </रेस के बंटवारे

  • +0

    के लिए कॉन्फ़िगरेशन समस्या भी हो सकती है DefaultPersistenceUnitManager और PersistenceUnitReader के लिए स्प्रिंग कोड को देखते हुए, मैंने देखा कि स्थानीय स्रोतों में इंजेक्शन वाले डेटासोर्स का उपयोग jta- और non-jta-datasource को परिभाषित करने के लिए किया जाता है दृढ़ता इकाई (यदि ऐसा कोई तत्व तत्व persistence.xml में घोषित किया गया है, जो भी मूल्य के साथ)। आखिरकार, यदि पीयू में कोई गैर-जेटीए-डेटा-स्रोत तत्व निर्दिष्ट नहीं है, तो उसी डेटासोर्स को गैर-जेटीए-डेटासोर्स के रूप में इंजेक्शन दिया जाता है। इस प्रकार, मैंने अपने persistence.xml में एक jta-data-source तत्व जोड़ा, और यह अभी भी वही व्यवहार करता है। – Gaetan

    +0

    वसंत हाइबरनेट के कनेक्शनप्रदाता इंटरफ़ेस के लिए 3 कार्यान्वयन प्रदान करता है: LocalDataSourceConnectionProvider और 2 उप-वर्ग, LocalJtaDataSourceConnectionProvider और TransactionAwareDataSourceConnectionProvider; वे सभी orm.hibernate3 पैकेज (जेपीए नहीं) में हैं, मुझे नहीं लगता कि उन्हें जेपीए के लिए इस्तेमाल किया जाना चाहिए। मेरे ऐप को चलाने पर, कॉन्फ़िगर किया गया कनेक्शन प्रदाता हैबर्ननेट इंजेक्शनडेटासोर्सकनेक्शनप्रोवाइडर है; मैं किसी प्रकार के लेनदेन-जागरूक डेटासोर्स की अपेक्षा करता हूं (जब तक कि लेनदेन पूरी तरह से WAS डेटासोर्स को नहीं दिया जाता है) ... – Gaetan

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