Secondo quanto ho capito, l'uso di PreparedStatement in Java è possibile utilizzarlo più volte. Ma ho un po 'di confusione con PreparedStatementCreator di Spring JDBC.Qual è il modo corretto di utilizzare PreparedStatementCreator of Spring JDBC?
Ad esempio si consideri codice seguente,
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();
}
}
}
Secondo questo codice, quando ho chiamato springTest.getNameFromId (int id) metodo, restituisce il nome dal dato id, Qui ho usato per la creazione di PreparedStatementCreator PreparedStatement e PreparedStatementSetter per l'impostazione dei parametri di input e ho ottenuto il risultato da ResultSetExtractor. Ma le prestazioni sono molto lente.
Dopo aver eseguito il debug e aver esaminato cosa succede all'interno di PreparedStatementCreator e JdbcTemplate, ho avuto modo di sapere che PreparedStatementCreator crea sempre nuove PreparedStatement ... !!!
Ogni volta che sono chiamata metodo jdbcTemplate.query (preparedStatementCreator, preparedStatementSetter, resultSetExtractor), crea un nuovo PreparedStatement e questo rallenta le prestazioni.
È questo il modo corretto di utilizzare PreparedStatementCreator? Perché in questo codice non riesco a riutilizzare PreparedStatement. E se questo è il modo giusto per usare PreparedStatementCreator di come trarre beneficio dalla riutilizzabilità di PreparedStatement?
ho provato anche con il ritorno stesso PreparedStatement, poi ho ottenuto l'errore "connessione chiusa", e quando ho cercato di usare lo stesso oggetto di connessione che ho ottenuto l'errore "Dichiarazione Closed" –
Se stai parlando in il tuo esempio sopra, sarebbe perché stai facendo una corretta gestione delle transazioni. Con una transazione in corso, tutto verrebbe eseguito contro la stessa connessione e il riutilizzo della stessa istruzione non dovrebbe essere un problema. –
Spiacenti, digita sopra ... fai in modo che "non * stai * facendo una corretta gestione delle transazioni". –