Dengan asumsi bahwa itu adalah BasicDataSource
berasal dari DBCP
, maka ya, Anda menggunakan kumpulan koneksi. Namun, Anda membuat ulang kumpulan koneksi lain pada setiap perolehan koneksi. Anda tidak benar-benar mengumpulkan koneksi dari kumpulan yang sama. Anda perlu membuat kumpulan koneksi hanya sekali pada saat startup aplikasi dan mendapatkan setiap koneksi darinya. Anda juga tidak boleh memegang koneksi sebagai variabel instan. Anda juga harus menutup koneksi, pernyataan, dan hasil untuk memastikan bahwa sumber daya ditutup dengan benar, juga jika ada pengecualian. try-with-resources
Java 7 pernyataan
sangat membantu dalam hal ini, itu akan menutup sumber daya secara otomatis ketika try
blok selesai.
Berikut ini penulisan ulang kecil:
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();
}
}
(ini dapat jika perlu difaktorkan ulang sebagai pabrik abstrak untuk meningkatkan kemampuan pluggability)
dan
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;
}
yang akan digunakan sebagai berikut:
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);
}
Namun, dalam lingkungan Java EE yang sebenarnya, Anda harus mendelegasikan pembuatan DataSource
ke container/server aplikasi dan mendapatkannya dari JNDI. Dalam kasus Tomcat, lihat juga misalnya dokumen ini:http ://tomcat.apache.org/tomcat-6.0-doc/jndi-resources-howto.html