Nach meinem Verständnis der Verwendung von PreparedStatement in Java können wir es mehrmals verwenden. Aber ich habe etwas Verwirrung mit PreparedStatementCreator von Spring JDBC.Was ist der richtige Weg, PreparedStatementCreator von Spring JDBC zu verwenden?
Zum Beispiel folgenden Code betrachten,
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();
}
}
}
Gemäß diesem Code, wenn ich springTest.getNameFromId (int id) Methode aufgerufen wird, gibt es Namen gegeben id, habe PreparedStatementCreator Hier habe ich für PreparedStatement Erstellung und PreparedStatementSetter zum Einstellen der Eingabeparameter und ich habe das Ergebnis von ResultSetExtractor erhalten. Aber Leistung ist sehr langsam.
Nach dem Debuggen und schauen was in PreparedStatementCreator und JdbcTemplate passiert, habe ich erfahren, dass PreparedStatementCreator jedes Mal neue PreparedStatement erstellt ... !!!
Jedes Mal, wenn ich Methoden jdbcTemplate.query (preparedStatementCreator, preparedStatementSetter, resultSetExtractor) aufruft, erstellt es neue PreparedStatement und dies verlangsamt die Leistung.
Ist dies der richtige Weg PreparedStatementCreator zu verwenden? Weil ich PreparedStatement in diesem Code nicht wiederverwenden kann. Und wenn dies der richtige Weg ist, um PreparedStatementCreator zu verwenden, als wie man von der Wiederverwendbarkeit von PreparedStatement profitieren kann? ...
ich auch mit der Rückkehr gleiche PreparedStatement versuchte, dann Fehler „Closed Connection“ ich habe, und als ich versuchte gleiches Verbindungsobjekt zu verwenden, als ich Fehler „Closed Statement“ bekam –
Wenn Sie im Gespräch sind Ihr Beispiel oben, das liegt daran, dass Sie eine ordnungsgemäße Transaktionsverwaltung durchführen. Bei einer laufenden Transaktion würde alles gegen die gleiche Verbindung ausgeführt werden, und die Verwendung der gleichen Anweisung sollte kein Problem darstellen. –
Sorry, Tippfehler über ... machen, dass "Sie * nicht * richtige Transaktionsverwaltung machen". –