sql >> Base de Datos >  >> RDS >> Mysql

¿Estoy utilizando la agrupación de conexiones JDBC?

Asumiendo que es el BasicDataSource es de DBCP , entonces sí, está utilizando un grupo de conexiones. Sin embargo, está recreando otro grupo de conexiones en cada adquisición de conexión. Realmente no está agrupando conexiones del mismo grupo. Debe crear el grupo de conexiones solo una vez en el inicio de la aplicación y obtener todas las conexiones de él. Tampoco debe mantener la conexión como una variable de instancia. También debe cerrar la conexión, la declaración y el conjunto de resultados para asegurarse de que los recursos se cierren correctamente, también en caso de excepciones. try-with-resources de Java 7 declaración es útil en esto, cerrará automáticamente los recursos cuando try el bloque está terminado.

Aquí hay una reescritura menor:

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

}

(si es necesario, esto puede refactorizarse como una fábrica abstracta para mejorar la capacidad de conexión)

y

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

que se utilizará de la siguiente manera:

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

Sin embargo, en un entorno Java EE real, debe delegar la creación del DataSource al contenedor/servidor de aplicaciones y obtenerlo de JNDI. En el caso de Tomcat, consulte también, por ejemplo, este documento:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html