0
votes

Est-ce mauvais quand une fonction revient sans clôture de déclaration préparée / Resultset?

Alors je suis tombé sur un morceau de code Java et remarqua la fonction de connexion 3 (int) si l'utilisateur est banni. La fermeture des Resultins et la déclaration préparée utilisée pour se connecter est après le retour, donc si l'utilisateur est banni, il n'est jamais réellement fermé. Ma question est que si la fonction renvoie 3, est-ce que cela atteint la partie "enfin" où il ferme tout?

J'ai créé un booléen et si le joueur est banni, le booléen est défini sur True. Ensuite, à la fin de la fonction où il renvoie "loginok" j'ai ajouté: p> xxx pré>

Cela devrait fonctionner mais je me demandais si la méthode précédente était mauvaise ou non. p>

Le code semble quelque peu comme suit: P>

    public int login(String login, String pwd) {

        Connection con = DatabaseConnection.getConnection();
        PreparedStatement ps = null;
        ResultSet rs = null;
        try {
            ps = con.prepareStatement("SELECT id, password, banned WHERE name = ?");
            ps.setString(1, login);
            rs = ps.executeQuery();
            if (rs.next()) {
                int banned = rs.getInt("banned");
                if (rs.getByte("banned") == 1) { 
                    return 3;
                }
                accId = rs.getInt("id");
                String passhash = rs.getString("password");
                ps.close();
                rs.close();
                if (getLoginState() > LOGIN_NOTLOGGEDIN) {
                    loggedIn = false;
                    loginok = 7;
                } else if (pwd.equals(passhash)) {
                    loginok = 0;
                } else {
                    loggedIn = false;
                    loginok = 4;
                }
            }
        } catch (SQLException e) {
            log.error("ERROR", e);
        } finally { //Or maybe its fine because of this?
            try {
                if (ps != null && !ps.isClosed()) {
                    ps.close();
                }
                if (rs != null && !rs.isClosed()) {
                    rs.close();
                }
            } catch (SQLException e) {
            }
        }
        return loginok;
    }


0 commentaires

4 Réponses :


2
votes

La méthode précédente était OK. La clause enfin sera exécutée. Dans le cas de la même manière que: L'instruction retour est exécutée, enfin est exécuté, la méthode revient réellement.


0 commentaires

1
votes

Je vous recommande vivement de refactoriser ce code pour utiliser try-with-ressources.

public int login(String login, String pwd) {
    Connection con = DatabaseConnection.getConnection();
    try (PreparedStatement ps = con.prepareStatement("SELECT id, password, banned WHERE name = ?")) {
        ps.setString(1, login);
        try (ResultSet rs = ps.executeQuery()) {
            if (rs.next()) {
                if (rs.getByte("banned") == 1) { 
                    return 3;
                }
                accId = rs.getInt("id");
                String passhash = rs.getString("password");
                if (getLoginState() > LOGIN_NOTLOGGEDIN) {
                    loggedIn = false;
                    loginok = 7;
                } else if (pwd.equals(passhash)) {
                    loginok = 0;
                } else {
                    loggedIn = false;
                    loginok = 4;
                }
            }
        }
    } catch (SQLException e) {
        log.error("ERROR", e);
    }
    return loginok;
}


0 commentaires

0
votes

Vous devriez utiliser le bras avec Java 7. De cette façon, vous n'avez pas à vous soucier de la fermeture de vos ressources dans le bloc enfin, mais vous avez besoin d'attraper des exceptions. Il y a une légère faille dans votre code cependant. Vous ne devriez pas utiliser un bloc IF à itération à travers le jeu de résultats. Vous ne chercheriez que la première ligne du jeu de résultats, et non itérer à travers le reste.

Votre code peut être quelque chose comme celui-ci P>

try(Connection con = DatabaseConnection.getConnection();
    ps = con.prepareStatement("SELECT id, password, banned WHERE name = ?");) {
   ps.setString(1, login);
   try(ResultSet rs = ps.executeQuery();) {
       while (rs.next()) {
            ... You calculations here ...
       }
   }

}


0 commentaires

0
votes

à votre question:

Si la fonction renvoie 3, il atteint-il la partie "enfin" où elle ferme tout?

Oui, il atteint toujours le bloc enfin . C'est ce que c'est enfin bloquer.

En outre, vous devriez vous rappeler de toujours libérer les ressources que vous allocez. Au fur et à mesure que les autres réponses soulignent, depuis Java 7, vous pouvez utiliser l'essai avec les ressources, qu'il est plus facile à utiliser, car le blocage enfin est implicite.

Les ressources de fermeture sont spécialement critiques dans des applications qui fonctionnent sans arrêt pendant une longue période, telles que des applications Web. Sinon, vous commencerez à perdre des ressources assez rapidement et le serveur devra être redémarré très souvent.


0 commentaires