Renvoyer des jeux de résultats en toute sécurité
Renvoyer un ensemble de résultats à partir d'une requête de base de données peut être une tâche complexe en raison du risque de fuite de ressources. Ici, nous abordons ce défi en explorant une approche alternative pour renvoyer les données efficacement.
Problème :
Lorsque vous tentez de renvoyer directement un ensemble de résultats, le code renvoie un java.sql.SQLException due à la fermeture du jeu de résultats après l'exécution de la méthode.
Solution : mappage vers JavaBeans
Au lieu de renvoyer l'ensemble de résultats lui-même, mappez les données à une collection de JavaBeans. Cette approche vous permet de garder la connexion et l'instruction ouvertes tout en parcourant l'ensemble de résultats. Voici un exemple :
public List<Biler> list() throws SQLException { Connection connection = null; PreparedStatement statement = null; ResultSet resultSet = null; List<Biler> bilers = new ArrayList<>(); try { connection = database.getConnection(); statement = connection.prepareStatement("SELECT id, name, value FROM Biler"); resultSet = statement.executeQuery(); while (resultSet.next()) { Biler biler = new Biler(); biler.setId(resultSet.getLong("id")); biler.setName(resultSet.getString("name")); biler.setValue(resultSet.getInt("value")); bilers.add(biler); } } finally { if (resultSet != null) try { resultSet.close(); } catch (SQLException ignore) {} if (statement != null) try { statement.close(); } catch (SQLException ignore) {} if (connection != null) try { connection.close(); } catch (SQLException ignore) {} } return bilers; }
Déclaration Try-with-Resources
Si vous utilisez Java 7 ou une version ultérieure, vous pouvez utiliser l'instruction try-with-resources déclaration de fermeture automatique des ressources :
public List<Biler> list() throws SQLException { List<Biler> bilers = new ArrayList<>(); try ( Connection connection = database.getConnection(); PreparedStatement statement = connection.prepareStatement("SELECT id, name, value FROM Biler"); ResultSet resultSet = statement.executeQuery(); ) { while (resultSet.next()) { Biler biler = new Biler(); biler.setId(resultSet.getLong("id")); biler.setName(resultSet.getString("name")); biler.setValue(resultSet.getInt("value")); bilers.add(biler); } } return bilers; }
Supplémentaire Considérations
Il est important d'éviter de déclarer la connexion, l'instruction et l'ensemble de résultats en tant que variables d'instance (problème de sécurité des threads). De plus, il est crucial de gérer les SQLExceptions de manière appropriée et de fermer les ressources dans le bon ordre. En suivant ces directives, vous pouvez renvoyer efficacement des ensembles de résultats tout en conservant la gestion des ressources.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!