sql >> Database >  >> RDS >> Mysql

Gebruik ik JDBC Connection Pooling?

Ervan uitgaande dat het de BasicDataSource is van DBCP , dan ja, u gebruikt een verbindingspool. U maakt echter bij elke verbindingsverwerving een andere verbindingsgroep. Je bent niet echt verbindingen uit dezelfde pool aan het poolen. U hoeft de verbindingspool slechts één keer te maken bij het opstarten van de toepassing en elke verbinding eruit te halen. U moet de verbinding ook niet als instantievariabele houden. Sluit ook de verbinding, verklaring en resultatenset om ervoor te zorgen dat de bronnen goed worden afgesloten, ook in geval van uitzonderingen. Java 7's try-with-resources verklaring is hierbij handig, het zal de bronnen automatisch sluiten wanneer de try blok is voltooid.

Hier is een kleine herschrijving:

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

}

(dit kan indien nodig worden omgevormd tot een abstracte fabriek om de pluggability te verbeteren)

en

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 als volgt gebruikt moet worden:

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 een echte Java EE-omgeving moet u echter de aanmaak van de DataSource delegeren naar de container / applicatieserver en verkrijg deze van JNDI. Zie voor Tomcat bijvoorbeeld ook dit document:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html



  1. Waarom komt de varchar-sorteervolgorde van Oracle niet overeen met het gedrag van varchar-vergelijking?

  2. Het gebruik van if(isset($_POST['submit'])) om geen echo weer te geven wanneer het script open is, werkt niet

  3. Rails 4 LIKE-query - ActiveRecord voegt aanhalingstekens toe

  4. Koppeltekens in kolomnamen in MySQL DB