मेरी समझ के अनुसार जावा में प्रीपेडस्टेटमेंट का उपयोग हम इसे कई बार उपयोग कर सकते हैं। लेकिन मुझे वसंत जेडीबीसी के प्रीपेडस्टेटमेंट निर्माता का उपयोग करके कुछ भ्रम है।स्प्रिंग जेडीबीसी के प्रीपेडस्टेटमेंट निर्माता का उपयोग करने का उचित तरीका क्या है?
उदाहरण के लिए कोड को अपनाने पर विचार,
public class SpringTest {
JdbcTemplate jdbcTemplate;
PreparedStatementCreator preparedStatementCreator;
ResultSetExtractor<String> resultSetExtractor;
public SpringTest() throws SQLException {
jdbcTemplate = new JdbcTemplate(OracleUtil.getDataSource());
preparedStatementCreator = new PreparedStatementCreator() {
String query = "select NAME from TABLE1 where ID=?";
public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
return connection.prepareStatement(query);
}
};
resultSetExtractor = new ResultSetExtractor<String>() {
public String extractData(ResultSet resultSet) throws SQLException,
DataAccessException {
if (resultSet.next()) {
return resultSet.getString(1);
}
return null;
}
};
}
public String getNameFromId(int id){
return jdbcTemplate.query(preparedStatementCreator, new Table1Setter(id), resultSetExtractor);
}
private static class Table1Setter implements PreparedStatementSetter{
private int id;
public Table1Setter(int id) {
this.id =id;
}
@Override
public void setValues(PreparedStatement preparedStatement) throws SQLException {
preparedStatement.setInt(1, id);
}
}
public static void main(String[] args) {
try {
SpringTest springTest = new SpringTest();
for(int i=0;i<10;i++){
System.out.println(springTest.getNameFromId(i));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
इस कोड को जब मैं springTest.getNameFromId कहा जाता है के अनुसार (पूर्णांक आईडी) विधि है, यह नाम दिया आईडी से लौटता है, यहाँ मैं PreparedStatement और बनाने के लिए उपयोग किया है PreparedStatementCreator इनपुट पैरामीटर सेट करने के लिए तैयार स्टेटमेंटसेटर और मुझे परिणाम SetExtractor से परिणाम मिला। लेकिन प्रदर्शन बहुत धीमा है।
डिबगिंग और तैयार किए जाने के बाद प्रीपेडस्टेटमेंट निर्माता और जेडीबीसी टेम्पलेट के अंदर क्या होता है मुझे पता चला है कि प्रीपेर्डस्टेटमेंट निर्माता प्रत्येक तैयार नई तैयारी करता है ... !!!
प्रत्येक बार जब मैं कॉल विधि jdbcTemplate.query (readyStatementCreator, readyStatementSetter, resultSetExtractor) कहता हूं, यह नया तैयार स्टेमेंट बनाता है और यह धीमा प्रदर्शन करता है।
क्या प्रीपेयरस्टेटमेंट निर्माता का उपयोग करने का यह सही तरीका है? क्योंकि इस कोड में मैं प्रीपेयरस्टेटमेंट का पुन: उपयोग करने में असमर्थ हूं। और यदि प्रीपेडस्टेटमेंट निर्माता की पुन: प्रयोज्यता के लाभ के मुकाबले प्रीपेडस्टेटमेंट निर्माता का उपयोग करने का यह सही तरीका है?
मैं भी साथ एक ही PreparedStatement लौटने, तो मैं त्रुटि "बंद कनेक्शन" हो गया, और करने की कोशिश की मैं एक ही कनेक्शन वस्तु का उपयोग करने की तुलना में मैं आप के बारे में बात कर रहे हैं त्रुटि "बंद वक्तव्य" –
मिला की कोशिश की आपका नमूना उपरोक्त होगा, ऐसा इसलिए होगा क्योंकि आप उचित लेनदेन प्रबंधन कर रहे हैं। एक लेनदेन प्रगति पर है, सब कुछ एक ही कनेक्शन के खिलाफ निष्पादित होगा, और उसी कथन का पुन: उपयोग करना कोई समस्या नहीं होनी चाहिए। –
क्षमा करें, ऊपर टाइपो ... इसे "आप * उचित लेनदेन प्रबंधन नहीं कर रहे हैं" बनाते हैं। –