Quelle est la bonne façon d'utiliser PreparedStatementCreator de Spring JDBC?

Selon ma compréhension de l'utilisation de PreparedStatement en Java, on peut l'utiliser plusieurs fois.
Mais j'ai une certaine confusion à l'aide de PreparedStatementCreator de Spring JDBC.

Par exemple envisager de code suivant,

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();
}
}
}

Que par ce code quand j'ai appelé springTest.getNameFromId(int id) de la méthode, il renvoie le nom de id donné, Ici j'ai utilisé PreparedStatementCreator pour la création de PreparedStatement et PreparedStatementSetter pour le réglage des paramètres d'entrée et j'ai eu raison de ResultSetExtractor.
Mais la performance est très lent.

Après le débogage et la recherche dans ce qui se passe à l'intérieur de PreparedStatementCreator et JdbcTemplate, j'ai appris qu'PreparedStatementCreator crée à chaque fois de nouvelles PreparedStatement...!!!

Chaque et chaque fois quand je fais des appels de méthode jdbcTemplate.requête(preparedStatementCreator, preparedStatementSetter, resultSetExtractor), il crée de nouvelles PreparedStatement et ce ralentissements des performances.

Est-ce la bonne façon de l'utiliser PreparedStatementCreator? Parce que dans ce code que je n'arrive pas à réutiliser PreparedStatement. Et si c'est la bonne façon de l'utiliser PreparedStatementCreator que la façon d'obtenir de bénéficier de la ré-utilisabilité de PreparedStatement?

OriginalL'auteur Jignesh Dhua | 2013-02-27