2008-10-21 13 views
8

मैं तैयार कथन कैश करने के लिए MySQL की क्षमता का लाभ कैसे उठा सकता हूं? तैयार बयानों का उपयोग करने का एक कारण यह है कि तैयार किए गए कथन को फिर से इस्तेमाल करने की आवश्यकता नहीं है यदि एक ही तैयार कथन का फिर से उपयोग किया जाना है।MySQL तैयार कथन कैशिंग का उपयोग कैसे करें?

Class.forName("com.mysql.jdbc.Driver"); 
Connection conn = DriverManager.getConnection("jdbc:mysql://127.0.0.1:3306/mydb" + 
     "?cachePrepStmts=true", "user", "pass"); 
for (int i = 0; i < 5; i++) { 
    PreparedStatement ps = conn.prepareStatement("select * from MYTABLE where id=?"); 
    ps.setInt(1, 1); 
    ps.execute(); 
} 
conn.close() 

उपर्युक्त जावा उदाहरण चलाने पर मुझे 5 जोड़े जोड़े और mysqld लॉग फ़ाइल में आदेश निष्पादित करें। लूप परिणामों के बाहर पीएस असाइनमेंट को एक सिंगल में तैयार करना और 5 पाठ्यक्रमों को निष्पादित करना। कनेक्शन पैरामीटर "cachePrepStmts = true" यहां कोई फर्क नहीं पड़ता है।
स्प्रिंग और हाइबरनेट का उपयोग करते हुए एक समान प्रोग्राम चलाते समय (1 या 5) भेजे गए कमांड तैयार करने की संख्या इस बात पर निर्भर करती है कि cachePrepStmts कनेक्शन पैरामीटर सक्षम है या नहीं। Hacheernate कैशPrepStmts सेटिंग का लाभ लेने के लिए तैयार कथन निष्पादित कैसे करता है? क्या शुद्ध जेडीबीसी का उपयोग करके इसका नकल करना संभव है?
मैं MySQL सर्वर 4.1.22 और mysql-कनेक्टर-जावा-5.0.4.jar

उत्तर

2

पर इस चल रहा था यह इस का उपयोग करते हुए शुद्ध JDBC नकल करने के लिए संभव है?

क्या यह वास्तव में आपके तैयार कथन कॉल को लूप से बाहर ले जाकर क्या किया गया है?

मैं जिस तरह से MySQL कैश काम करता गलतफहमी हो सकता है लेकिन लॉग फ़ाइल जरूरी कैश के काम क्यों होते हैं? ऐसा हो सकता है कि स्प्रिंग या हाइबरनेट का अपना इंटरमीडिएट कैश है जो पहले भेजे गए लोगों के खिलाफ तैयार बयानों की जांच करता है। ऐसा हो सकता है कि जब आप स्प्रिंग के साथ प्रोग्राम चलाते हैं तो आप देख रहे हैं। इसका मतलब यह होगा कि आपके सिस्टम के साथ कुछ ट्रेसिंग करना है यह देखने के लिए कि क्या mysqld लॉग सिर्फ उन बयानों की रिपोर्ट कर रहा है, जो इसे भेजे गए हैं, भले ही यह उनके साथ कैसे व्यवहार करता है।

2

आप लूप के बाहर केवल एक बार अपने बयान तैयार करना चाहिए, और फिर पाश में पैरामीटर बाँध। यही कारण है कि तैयार बयानों में पैरामीटर बाध्य हैं - ताकि आप तैयार कथन का पुन: उपयोग कर सकें।

हाइबरनेट वास्तव में यह करता है, पर्दे के पीछे एक तैयार बयान के रूप में सभी एसक्यूएल इलाज, हालांकि आप स्पष्ट रूप से इस का दुरुपयोग कर सकते हैं अगर आप बाँध मापदंडों के बजाय शाब्दिक का उपयोग करें।

1

पहले, अपने PreparedStatement, पाश में निर्मित किया जाता है ताकि JDBC ड्राइवर तैयार डेटा त्यागने के लिए अनुमति दी है। तो आपने बदसूरत व्यवहार के लिए कहा, और इसलिए आपको यह मिला।

और फिर, MySQL में PreparedStatement अपने दम पर एक अध्याय है। असली कैशिंग करने के लिए, आपको कनेक्शन कनेक्शन के माध्यम से इसे स्पष्ट रूप से अनुरोध करना होगा।

तो तुम तैयार बयान पर कैशिंग प्राप्त करने के लिए "सही" के लिए "cachePrepStmts" गुण सेट करने के लिए है। डिफ़ॉल्ट रूप से, वह संपत्ति गलत पर सेट होती है।

विवरण

1

आप पाश के बाहर बयान तैयार करना चाहिए के लिए अपने MySQL संस्करण के लिए MySQL मैनुअल @see।

Connection conn = DatabaseUtil.getConnection(); 
PreparedStatement stmtUpdate = conn.prepareStatement("UPDATE foo SET bar=? WHERE id = ?"); 
for(int id=0; id<10; id++){ 
    stmtUpdate.setString(1, "baz"); 
    stmtUpdate.setInt(2, id); 
    int rows = stmtUpdate.executeUpdate(); 
    // Clear parameters for reusing the preparedStatement 
    stmtUpdate.clearParameters(); 
} 
conn.close(); 

मैं mysql कैशिंग तैयार बयान के बारे में पता नहीं है, लेकिन इस तरह से JDBC तैयार बयान पुन: उपयोग किया जाना चाहिए रहे हैं।

2

आपको कनेक्शन उदाहरण पर स्टेटमेंट कैश आकार सेट करने की भी आवश्यकता है। मुझे लगता है कि डिफ़ॉल्ट कैश आकार 0 है। इसलिए कुछ भी कैश नहीं किया जाएगा।

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