2011-11-25 16 views
5

मुझे डेटाबेस में हाइबरनेट द्वारा किए गए प्रश्नों की मात्रा में कोई समस्या है। यहाँ मेरी क्वेरी लॉग (MySQL 5.1 का प्रयोग करके) डेटाबेस के लिए जब एक साधारण का चयन कर रही है:डेटाबेस पर हाइबरनेट क्वेरी

111125 7:18:30 
27 Query SET autocommit=0 
27 Query SELECT @@session.tx_isolation 
27 Query select this_.id as id34_0_, this_.media_id as media3_34_0_, this_.message as message34_0_, this_.user_id as user4_34_0_ from notifications this_ 
27 Query rollback 
27 Query SET autocommit=1 

मैं 1. 0 को autocommit करना और फिर बारे में बहुत कुछ पढ़ा है मुझे पता है कि एक कनेक्शन के लिए डिफ़ॉल्ट 1 है और यह व्यवहार बदला नहीं जा सकता है। आप एसईटी autocommit = 0 चला सकते हैं लेकिन परिणाम वही है।

क्या इनमें से किसी भी प्रश्न से बचने के लिए वैसे भी है? मुझे नहीं पता कि SELECT @@ session.tx_isolation क्यों हो रहा है और रोलबैक क्यों है। जब मैं एक लेनदेन का उपयोग करता हूं तो मुझे एक प्रतिबद्धता मिलती है और फिर रोलबैक मिलता है। निश्चित नहीं है कि रोलबैक हमेशा क्यों सक्षम होता है।

बहुत बहुत धन्यवाद!

मेरे conf: वसंत 2.5.6, हाइबरनेट 3.6.0, Mysql 5,1

datasoure.xml:

<bean id="dataSource" destroy-method="close" 
    class="org.apache.commons.dbcp.BasicDataSource"> 
    <property name="driverClassName" value="${jdbc.driverClassName}" /> 
    <property name="url" value="${jdbc.url}" /> 
    <property name="username" value="${jdbc.username}" /> 
    <property name="password" value="${jdbc.password}" /> 

    <property name="initialSize" value="3" /> 
    <property name="maxActive" value="20" /> 
    <property name="minIdle" value="3" /> 
    <property name="poolPreparedStatements" value="false" /> 
    <property name="defaultAutoCommit" value="false" /> 
    <property name="defaultTransactionIsolation" value="4" /> 
</bean> 

लेन-देन प्रबंधक परिभाषा:

<bean id="transactionManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 

अद्यतन: नई संपत्ति

सेट करके रोलबैक निकालने के लिए प्रबंधित
<property name="defaultReadOnly" value="true" /> 

लेकिन अब समस्या यह है कि आप एक संशोधन नहीं कर सकते हैं (कोई फर्क नहीं पड़ता कि मैं लेनदेन संबंधी एनोटेशन को केवल पढ़ने के लिए = झूठा) डीबी को एसक्यूलेक्सप्शन दे रहा हूं। यह संपत्ति सत्य को केवल पढ़ने के लिए सेट करती है। मुझे लगता है कि HibernateTemplate के साथ ऐसा करने का कोई तरीका नहीं है।

मैं आंतरिक कोड बुनाई के लिए पहलू लेनदेन का उपयोग करता हूं।

<aop:aspectj-autoproxy proxy-target-class="true" /> 
+0

आपके लेनदेन विफल हो जाते हैं! क्या आपने वसंत संदर्भ में लेनदेन प्रबंधक को सक्षम किया था? और आपका लॉग सामान्य है, रोलबैक को छोड़कर मेरा समान है। – madhead

+0

यह सिर्फ एक चयन है और इसमें कोई @transactional एनोटेशन नहीं है। ऐसा लगता है कि सबकुछ एक लेनदेन के रूप में माना जा रहा है। – Gonzalo

+0

मेरा मतलब है देशी डीबी स्तर: 27 क्वेरी रोलबैक। यह रोलबैक लेनदेन। क्या आपके इन्सर्ट या अपडेट सही तरीके से काम कर रहे हैं? – madhead

उत्तर

1

आपको अपने आवेदन के लिए लेनदेन कॉन्फ़िगर करने की आवश्यकता है। Spring 2.5.x documentation on transaction management देखें।

संपादित करें 12/3/11: यहां तक ​​कि केवल विधियों के लिए भी चयन करने के लिए, आपको अभी भी अपने पोस्ट में उल्लिखित अतिरिक्त प्रश्नों को हटाने के लिए केवल पढ़ने के लिए लेनदेन बनाना होगा। बस @transactional (readOnly = true) लिखें और आपको जाने के लिए अच्छा होना चाहिए।

संपादित करें 12/20/11: आपको यह सुनिश्चित करने की भी आवश्यकता है कि लेनदेन सही तरीके से कॉन्फ़िगर किए गए हों। ऐसा लगता है कि आपके द्वारा पोस्ट की गई कॉन्फ़िगरेशन में < टीएक्स: एनोटेशन-संचालित /> एनोटेशन गुम हो सकता है। section 10.5.1 of the Spring documentation देखें।

+0

पर उस रोलबैक के साथ ओवरहेड जोड़ रहा हूं मैंने लेनदेन प्रबंधक को जोड़ा है। जब मुझे लेनदेन की आवश्यकता होती है तो मैं @transactional एनोटेशन का उपयोग करता हूं लेकिन इस मामले में, कोई लेनदेन नहीं चल रहा है। – Gonzalo

+0

यहां तक ​​कि केवल विधियों के लिए भी चयन करने के लिए, आपको अभी भी अपनी पोस्ट में उल्लिखित अतिरिक्त प्रश्नों को हटाने के लिए केवल पढ़ने के लिए लेनदेन बनाना होगा। बस @transactional (readOnly = true) लिखें और आपको जाने के लिए अच्छा होना चाहिए। – user393274

+0

अभी भी वही लेनदेन रोलबैक और ऑटोोकॉमिट प्राप्त हो रहा है। मुझे अब भी readonly = true – Gonzalo

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