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