Giả sử rằng đó là BasicDataSource
là từ DBCP
, thì có, bạn đang sử dụng một nhóm kết nối. Tuy nhiên, bạn đang tạo lại một nhóm kết nối khác trên mỗi lần có được kết nối. Bạn không thực sự gộp các kết nối từ cùng một nhóm. Bạn chỉ cần tạo nhóm kết nối một lần khi khởi động ứng dụng và nhận mọi kết nối từ nó. Bạn cũng không nên giữ kết nối như một biến thể hiện. Bạn cũng nên đóng kết nối, câu lệnh và tập kết quả để đảm bảo rằng các tài nguyên được đóng đúng cách, cũng như trong trường hợp ngoại lệ. try-with-resources
của Java 7 tuyên bố
rất hữu ích trong việc này, nó sẽ tự động đóng tài nguyên khi try
khối đã hoàn thành.
Đây là một đoạn viết lại nhỏ:
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();
}
}
(điều này có thể được cấu trúc lại nếu cần thiết như một nhà máy trừu tượng để cải thiện khả năng cắm vào)
và
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;
}
được sử dụng như sau:
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);
}
Tuy nhiên, trong môi trường Java EE thực, bạn nên ủy quyền việc tạo DataSource
tới vùng chứa / máy chủ ứng dụng và lấy nó từ JNDI. Trong trường hợp Tomcat, hãy xem thêm ví dụ tài liệu này: http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html