Zakładając, że jest to BasicDataSource
pochodzi z DBCP
, to tak, używasz puli połączeń. Jednak przy każdym pozyskaniu połączenia odtwarzasz inną pulę połączeń. Tak naprawdę nie łączysz połączeń z tej samej puli. Pulę połączeń należy utworzyć tylko raz podczas uruchamiania aplikacji i pobierać z niej każde połączenie. Nie należy również przechowywać połączenia jako zmiennej instancji. Należy również zamknąć połączenie, instrukcję i zestaw wyników, aby zapewnić prawidłowe zamknięcie zasobów, również w przypadku wyjątków. try-with-resources
oświadczenie
jest w tym pomocne, automatycznie zamknie zasoby, gdy try
blok jest zakończony.
Oto drobna przeróbka:
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();
}
}
(może to w razie potrzeby zostać przekształcone w abstrakcyjną fabrykę, aby poprawić podłączalność)
i
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;
}
który ma być używany w następujący sposób:
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);
}
W prawdziwym środowisku Java EE należy jednak delegować tworzenie DataSource
do kontenera/serwera aplikacji i uzyskaj go z JNDI. W przypadku Tomcata zobacz także na przykład ten dokument:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html