2012-08-15 13 views
5

स्पष्टीकरण के लिए: मुझे पता है कि लूप के बाहर PreparedStatement बनाने के लिए यह सही बात है। मैं तो बस जिज्ञासा से बाहर इस सवाल पूछा है।लूप के अंदर एक तैयार कथन का निर्माण


की है कि मैं हमेशा एक ही SQL क्वेरी के साथ एक पाश के अंदर एक PreparedStatement बना रहा हूं मान लेते हैं।

final String sql = "INSERT INTO ..."; 
while (condition) { 
    ... 
    PreparedStatement statement = connection.prepareStatement(sql); 
    // Fill values of the prepared statement 
    // Execute statement 
    ... 
} 

इस बेकार के बाद से PreparedStatement वस्तु हमेशा नए सिरे से बनाई गई है है? या अंतर्निहित डेटाबेस स्वीकार करते हैं कि यह हमेशा एक ही SQL क्वेरी जिसके साथ PreparedStatement बनाया है और वह पुनः उपयोग कर लेता है करता है?

+0

क्यों क्या आप टी बना रहे हैं वह लूप के अंदर 'प्रीपेर्डस्टेटमेंट' है? लूप के बाहर सृजन रखें और इसे लूप में दोबारा उपयोग करें। – Jesper

+2

एक तैयार कथन का बिंदु इसे एक बार तैयार करना है, और इसे कई बार उपयोग करना है। वास्तविक कार्यान्वयन ड्राइवर तक हो सकता है, लेकिन आपको यह देखने के लिए spec जांचना होगा कि इसके बारे में कोई वास्तविक नियम हैं या नहीं। –

+0

@ जेस्पर मुझे पता है कि यह लूप को उतारने के लिए बेहतर है। मैंने जिज्ञासा से इस प्रश्न को अभी पूछा है। :-) ओरेकल के दस्तावेज प्रदान करने के लिए –

उत्तर

1

कुछ ड्राइवरों तैयार बयानों को कैश है, हाँ देखें। , http://docs.oracle.com/cd/B10501_01/java.920/a96654/stmtcach.htm

मैं वहाँ कुछ भी है कि इस सभी चालकों के लिए सच हो करने की आवश्यकता है है पर विश्वास नहीं है, हालांकि निश्चित रूप से इसके कई JDBC चालकों की संभावना सुविधा की तरह लगता है: उदाहरण के लिए, इस ओरेकल प्रलेखन स्किम। ऐसा लगता है MySQL की तरह यह नहीं कर सकता है: How to use MySQL prepared statement caching?

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

+0

+1 –

8

1. आप ही पाश भर PreparedStatement का उपयोग कर रहे हैं, तो इसके बेहतर आप पाश बाहरPreparedStatementरहते हैं।

2. आप एसक्यूएल बयान जो पाश अंदर बदलते रहता है, तो केवल अपने लायक पाश में इसका उपयोग करने है।

3. इसके अलावा अगर इसके रखें बदल रहा है, तो बस का उपयोग StatementPreparedStatement के बजाय, किसी और PreparedStatement का उद्देश्य खो दिया है के रूप में आप इसे बदलने रखने के लिए।

1

दो तरीके का उपयोग करें कि अब तक मुझे पता है।

1 रास्ता

इसका एक

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.executeUpdate(); 
} 

(या)

2 माध्यम से रिकॉर्ड एक सम्मिलित

यह सम्मिलित करता है थोक के रूप में सभी रिकॉर्ड सम्मिलित

final String sql = "INSERT INTO tablename(columnname) Values(?)"; 

PreparedStatement statement = connection.prepareStatement(sql); 

while (condition) { 
statement.setString(1,value); 
statement.addBatch(); 
} 

statement.executeBatch(); 
संबंधित मुद्दे