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
Vous devez vous connecter pour publier un commentaire.
Préparé les Instructions sont généralement mis en cache par la connexion sous-jacente de la piscine, de sorte que vous n'avez pas besoin de vous soucier d'en créer un nouveau à chaque fois ou pas.
Donc, je pense que votre réalité utilisation est correcte.
JdbcTemplate ferme la déclaration après son exécution, donc si vous voulez vraiment la réutilisation de la même déclaration préparée à l'avance, vous pourriez proxy de la déclaration et intercepter la méthode close dans la déclaration créateur
Par exemple (non testé, seulement à titre d'exemple):
OriginalL'auteur Jose Luis Martin
Vous êtes sur la bonne façon de l'utiliser PreparedStatementCreator.
Pour résumer, ce que tu as fait est correct. utilisation PreparedStatement aura de meilleures performances que Déclaration.
OriginalL'auteur Henry Leu
Je ne sais pas pourquoi c'est si choquant puisque c'est votre propre code qui crée une nouvelle
PreparedStatement
chaque moment en appelantconnection.prepareStatement(query);
. Si vous souhaitez réutiliser le même, alors vous ne devriez pas en créer un nouveau.Si vous parlez dans votre exemple ci-dessus, ce serait parce que vous êtes en train de faire la bonne gestion des transactions. Avec une transaction en cours, tout allait s'exécuter sur la même connexion, et la réutilisation de la même déclaration ne devrait pas être un problème.
Désolé, faute de frappe au-dessus de... faire en sorte que "vous êtes pas en faisant de la bonne gestion des transactions".
OriginalL'auteur Ryan Stewart