Mysql
 sql >> Base de données >  >> RDS >> Mysql

Est-ce que j'utilise le regroupement de connexions JDBC ?

En supposant qu'il s'agisse de BasicDataSource provient de DBCP , alors oui, vous utilisez un pool de connexions. Cependant, vous recréez un autre pool de connexions à chaque acquisition de connexion. Vous ne regroupez pas vraiment les connexions du même pool. Vous devez créer le pool de connexions une seule fois au démarrage de l'application et en obtenir toutes les connexions. Vous ne devez pas non plus conserver la connexion en tant que variable d'instance. Vous devez également fermer la connexion, l'instruction et le jeu de résultats pour vous assurer que les ressources sont correctement fermées, également en cas d'exceptions. try-with-resources de Java 7 déclaration est utile à cet égard, il fermera automatiquement les ressources lorsque le try bloc est terminé.

Voici une réécriture mineure :

public final class Database {

    private static final BasicDataSource dataSource = new BasicDataSource();

    static {
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dataSource.setUrl("jdbc:mysql://localhost:3306/data");
        dataSource.setUsername("USERNAME");
        dataSource.setPassword("PASSWORD");
    }

    private Database() {
        //
    }

    public static Connection getConnection() throws SQLException {
        return dataSource.getConnection();
    }

}

(cela peut si nécessaire être refactorisé comme une fabrique abstraite pour améliorer la connectabilité)

et

private static final String SQL_EXIST = "SELECT * FROM users WHERE username=? AND password=?";

public boolean exist(User user) throws SQLException {
    boolean exist = false;

    try (
        Connection connection = Database.getConnection();
        PreparedStatement statement = connection.prepareStatement(SQL_EXIST);
    ) {
        statement.setString(1, user.getUsername());
        statement.setString(2, user.getPassword());

        try (ResultSet resultSet = preparedStatement.executeQuery()) {
            exist = resultSet.next();
        }
    }       

    return exist;
}

qui doit être utilisé comme suit :

try {
    if (!userDAO.exist(username, password)) {
        request.setAttribute("message", "Unknown login. Try again.");
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    } else {
        request.getSession().setAttribute("user", username);
        response.sendRedirect("userhome");
    }
} catch (SQLException e) {
    throw new ServletException("DB error", e);
}

Dans un vrai environnement Java EE il faut cependant déléguer la création du DataSource au conteneur/serveur d'application et obtenez-le auprès de JNDI. Dans le cas de Tomcat, voir aussi par exemple ce document :http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html