2012-02-17 11 views
5

से स्टेल डेटा लौटा रही है, मैं एक उत्तर के लिए स्टैक ओवरफ्लो खोज रहा हूं लेकिन ऐसा लगता है कि इसमें हाइबरनेट या कुछ अन्य डेटाबेस रैपर शामिल नहीं हैं।जावा MYSQL/JDBC क्वेरी कैश्ड कनेक्शन

मैं जेएमबीसी का उपयोग सीधे टॉमकैट 6 जावा ईई ऐप में MYSQL 5.18 जेडीबीसी ड्राइवर के माध्यम से कर रहा हूं। मैं कनेक्शन ऑब्जेक्ट्स कैशिंग कर रहा हूं, लेकिन वक्तव्य ऑब्जेक्ट्स कैशिंग नहीं कर रहा हूं। क्वेरी के लिए परिणामसेट्स पहले रन पर डेटा डेटा को सही तरीके से लौट रहे हैं। जब मैं PHPMyAdmin या किसी अन्य बाहरी उपकरण के माध्यम से कुछ पंक्तियों को बदलता हूं, तो क्वेरी को दोबारा शुरू करें, मुझे पुराना डेटा पुराना मिलता है।

मैं सामान्य स्टेटमेंट का उपयोग कर रहा हूं, तैयार किए गए स्टेटमेंट्स नहीं। मैंने ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE का प्रयास किया है। मैं परिणाम सेट को भी बंद कर रहा हूं। ये समस्या का समाधान नहीं करते हैं। मैंने ResultSet.refreshRows() का भी प्रयास किया है, लेकिन इसके परिणामस्वरूप त्रुटि हुई है क्योंकि क्वेरी में जॉइन क्लॉज है।

एकमात्र चीज जो स्पष्ट रूप से समस्या हल करती है कनेक्शन को बंद कर रही है और डेटाबेस से पुनः कनेक्ट कर रही है, जिसके परिणामस्वरूप प्रत्येक क्वेरी प्रयास के लिए भारी लागत होती है।

क्या स्टेल डेटा लौटाए बिना कनेक्शन का पुन: उपयोग करने का कोई तरीका है?

संपादित करें: मैं इस समय प्रश्नों के लिए लेनदेन का उपयोग नहीं कर रहा हूं।

यहां सामान्य कोड है।

Connection conn; //created elsewhere and reused 
... 

String query = "SELECT p.ID as oid,rid,handle,summary,city,state,zip,t.name AS category  
       FROM profiles AS p 
       JOIN (terms AS t) ON (p.tid = t.ID) 
       WHERE p.ID = 1"; 

ResultSet resultSet; 
Statement s; 
synchronized (conn) 
{        
    s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
          ResultSet.CONCUR_UPDATABLE);       
    resultSet = s.executeQuery(query); 
} 

//Iterate over the results using .next() and copy data to another data structure 
List retval = getResults(resultSet); 
s.close(); 

अग्रिम सहायता के लिए धन्यवाद!

+2

क्या आप लेनदेन का उपयोग कर रहे हैं? यदि ऐसा है तो अलगाव स्तर क्या है? ऐसा लगता है कि रीपेटेबल रीड व्यवहार की तरह थोड़ा सा लगता है। –

+0

अच्छा सवाल। इन प्रश्नों के लिए कोई लेनदेन नहीं।मैं सामान्य रूप से अपडेट/आवेषण के लिए लेनदेन का उपयोग करता हूं, लेकिन इस विशेष मामले में मैं अभी भी ऐप के भीतर किसी को निष्पादित नहीं कर रहा हूं। मैं एक बाहरी उपकरण के माध्यम से अद्यतन कर रहा हूं जो चीजों को फेंक सकता है। यदि आप गंदे पढ़ने को रोकने के लिए समाधान के रूप में लेनदेन की अनुशंसा करते हैं, तो कृपया एक उत्तर साझा करें। इसके अलावा, मैंने कनेक्शन पर कोई अलगाव स्तर निर्धारित नहीं किया है। क्या यह समस्या होगी? – ricosrealm

उत्तर

9

बाहर निकलता है यह असामान्य प्रश्नों का मामला था। लेनदेन के बारे में सवाल के लिए ब्रेंट वर्डेन के लिए धन्यवाद, जिसने मुझे चारों ओर देखने के लिए प्रेरित किया और नोटिस किया कि मैंने ऑटो प्रतिबद्धता को अक्षम कर दिया है और प्रश्नों के बाद काम नहीं कर रहा था।

तो समाधान है कि मेरे लिए काम किया:

conn.setAutoCommit(true); 

या

statement.executeQuery(query); 
conn.commit(); 

इस क्वेरी का उपयोग करके प्लावित हो सकता है और पुराना डेटा को रोका जाता है की अनुमति देता है।

+0

क्या आप इसे उत्तर के रूप में चिह्नित कर सकते हैं? इस तरह, लोग इस पोस्ट को ढूंढ सकते हैं और अपनी समस्या और समाधान पढ़ सकते हैं :)। –

+0

मैं 2 दिनों में होगा। मैं फिलहाल नहीं कर सकता क्योंकि साइट मुझे नहीं जाने देगी। – ricosrealm

+0

आपका मतलब है 'conn.commit();' सही? –

0

आप अपाचे डीबीयूटील्स का उपयोग करके जेडीबीसी पूल का उपयोग क्यों नहीं करते हैं। यह आपको एक ही कनेक्शन का उपयोग करने और कनेक्शन आकार को नियंत्रित करने की अनुमति देता है। लिंक http://commons.apache.org/dbutils

+0

सूचक के लिए धन्यवाद। मैं कोशिश कर सकता हूं और इस कोड को देख सकता हूं। हालांकि मैं यहां एक बड़ा कोड रैपर के बिना कुछ बहुत आसान करने की कोशिश कर रहा हूं। – ricosrealm

3

नीचे लेनदेन अलगाव स्तर सेट करें।

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

1

मेरी mysql स्थापना: इंजन = InnoDB, डिफ़ॉल्ट tx_isolation = REPEATABLE_READ

spring.xml

<tx:method name="find*" propagation="SUPPORTS" read-only="true" timeout="600" /> 

अगर उपयोग जमा कनेक्शन जो हमेशा समान परिणाम देगी!

mysql tx_isolation = READ_COMMITTED ने मेरी समस्या का समाधान किया।

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