BasicDataSource
>
DBCP
からのものです 、はい、接続プールを使用しています。ただし、接続を取得するたびに別の接続プールを再作成しています。同じプールからの接続を実際にプールしているわけではありません。アプリケーションの起動時に一度だけ接続プールを作成し、そこからすべての接続を取得する必要があります。また、接続をインスタンス変数として保持しないでください。また、例外の場合にも、リソースが適切に閉じられるように、接続、ステートメント、および結果セットを閉じる必要があります。 Java7の try-with-resources
ステートメント
これには役立ちます。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