Mysql
 sql >> Database >  >> RDS >> Mysql

Sto usando il pool di connessioni JDBC?

Supponendo che sia il BasicDataSource proviene da DBCP , allora sì, stai usando un pool di connessioni. Tuttavia, stai ricreando un altro pool di connessioni su ogni acquisizione di connessioni. Non stai davvero raggruppando le connessioni dallo stesso pool. È necessario creare il pool di connessioni solo una volta all'avvio dell'applicazione e ottenere tutte le connessioni da essa. Inoltre, non dovresti mantenere la connessione come variabile di istanza. Dovresti anche chiudere la connessione, l'istruzione e il set di risultati per assicurarti che le risorse siano chiuse correttamente, anche in caso di eccezioni. try-with-resources di Java 7 dichiarazione è utile in questo, chiuderà automaticamente le risorse quando try il blocco è terminato.

Ecco una piccola riscrittura:

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

}

(questo può essere se necessario rifattorizzato come una fabbrica astratta per migliorare la collegabilità)

e

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

che deve essere utilizzato come segue:

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

In un vero ambiente Java EE dovresti comunque delegare la creazione del DataSource al container/server delle applicazioni e ottenerlo da JNDI. In caso di Tomcat, vedere anche ad esempio questo documento:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html