Ако приемем, че това е BasicDataSource
е от DBCP
, тогава да, използвате пул за връзки. Въпреки това, вие пресъздавате друг пул за връзки при всяко придобиване на връзка. Вие всъщност не обединявате връзки от един и същи пул. Трябва да създадете пула за връзки само веднъж при стартиране на приложението и да получите всяка връзка от него. Също така не трябва да държите връзката като променлива на екземпляра. Трябва също да затворите връзката, оператора и набора от резултати, за да гарантирате, че ресурсите са правилно затворени, също в случай на изключения. try-with-resources
на Java 7 изявление
е полезен в това, той автоматично ще затвори ресурсите, когато try
блокът е завършен.
Ето малко пренаписване:
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();
}
}
(това може, ако е необходимо, да бъде преработено като абстрактна фабрика за подобряване на включваемостта)
и
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;
}
който трябва да се използва, както следва:
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);
}
В реална Java EE среда обаче трябва да делегирате създаването на DataSource
към контейнера/сървъра на приложения и го вземете от JNDI. В случай на Tomcat, вижте също например този документ:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html