Supondo que seja o
BasicDataSource
é de DBCP
, então sim, você está usando um pool de conexões. No entanto, você está recriando outro pool de conexões em cada aquisição de conexão. Você não está realmente agrupando conexões do mesmo pool. Você precisa criar o pool de conexões apenas uma vez na inicialização do aplicativo e obter todas as conexões dele. Você também não deve manter a conexão como uma variável de instância. Você também deve fechar a conexão, a instrução e o conjunto de resultados para garantir que os recursos sejam fechados corretamente, também em caso de exceções. try-with-resources
do Java 7 declaração
é útil para isso, ele fechará automaticamente os recursos quando o try
bloco está finalizado. Aqui está uma pequena reescrita:
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();
}
}
(isso pode, se necessário, ser refatorado como uma fábrica abstrata para melhorar a capacidade de conexão)
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;
}
que deve ser usado da seguinte forma:
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);
}
Em um ambiente Java EE real, você deve, no entanto, delegar a criação do
DataSource
para o contêiner/servidor de aplicativos e obtê-lo do JNDI. No caso do Tomcat, veja também, por exemplo, este documento:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html