मैं निम्नलिखित घटकों के साथ एक आवेदन चल रहा हूँ:, 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 है कि जेनडी डेटासोर्स से हाइबरनेट के कनेक्शनप्रोवाइडर द्वारा अनुरोध किया गया, जब तक डेटासोर्स मुफ्त कनेक्शन से बाहर नहीं हो जाता और आखिरकार लटकता है।
यहाँ विन्यास के हिस्से हैं:
स्प्रिंग:
<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>
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>
सेवा
@Transactional(readOnly=true) @Service public class MyServiceImpl implements MyService { @Autowired MyDao dao; public void getSomething() { dao.findSomething(); } }
डीएओ
@Repository public class MyDaoJap implements MyDao { @PersistenceContext EntityManager em; public void findSomething() { em.find(...); } }
नोट लेन-देन है, जो प्रवाह के हठ के लिए सामान्य है केवल पढ़ने के लिए: केवल पिछले संक्रमण (प्रतिबद्ध के साथ सच =) एक गैर केवल पढ़ने के लिए लेन-देन संबंधी विधि invokes। केवल पढ़ने के लिए ध्वज स्वचालित रूप से HUernernate फ्लश मोड को मैन्युअल में बदल देता है।
कुछ डिबग करते समय, मैंने देखा है निम्नलिखित:
- UOW लेनदेन प्रबंधक सही ढंग से सेवा के अवरोधन श्रृंखला है, जो पता चलता है कि एक सौदे सक्रिय है
- हाइबरनेट एक कनेक्शन के लिए पूछता है में शुरू हो जाती है ईएमएफ में इंजेक्शन वाले कच्चे डेटासोर्स पर DataSource.getConnection() का आह्वान करके; कनेक्शन प्राप्त करने की रणनीति हाइबरनेट के इंजेक्शनडेटासोर्सकनेक्शनप्रोवाइडर से है, और यह वर्ग WAS डेटासोर्स का संदर्भ देता है (एक प्रॉक्सी नहीं जो सक्रिय लेनदेन से अवगत है, या ऐसे)।
मुझे लगता है कि समस्या इस दूसरी बिंदु में है, लेकिन मुझे मेरी कॉन्फ़िगरेशन में कोई त्रुटि नहीं मिल रही है। क्या कोई मदद कर सकता है?
आपकी मदद के लिए धन्यवाद।
दूसरा सही उत्तर है। डेटासोर्स का साझा करने का दायरा अछूत था। बहुत बहुत धन्यवाद। – Gaetan