Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Verwende ich das JDBC Connection Pooling?

Angenommen, es handelt sich um den BasicDataSource stammt von DBCP , dann verwenden Sie ja einen Verbindungspool. Sie erstellen jedoch bei jedem Verbindungsaufbau einen weiteren Verbindungspool neu. Sie bündeln nicht wirklich Verbindungen aus demselben Pool. Sie müssen den Verbindungspool nur einmal beim Start der Anwendung erstellen und alle Verbindungen daraus abrufen. Sie sollten die Verbindung auch nicht als Instanzvariable halten. Sie sollten auch die Verbindung, die Anweisung und die Ergebnismenge schließen, um sicherzustellen, dass die Ressourcen ordnungsgemäß geschlossen werden, auch im Fall von Ausnahmen. try-with-resources von Java 7 Erklärung dabei hilfreich ist, werden die Ressourcen beim try automatisch geschlossen Block ist fertig.

Hier ist eine kleine Umschreibung:

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

}

(Dies kann bei Bedarf als abstrakte Fabrik umgestaltet werden, um die Steckbarkeit zu verbessern)

und

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

die wie folgt zu verwenden ist:

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 einer echten Java-EE-Umgebung sollten Sie jedoch die Erstellung der DataSource delegieren auf den Container/Anwendungsserver übertragen und von JNDI beziehen. Im Fall von Tomcat siehe beispielsweise auch dieses Dokument:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html