データ ソースと共にすぐに使用できるソリューション (構成のみ) については知りません。
しかし、あなたはそれを実装することができます.これらのアプローチを見てください:
要求ごとにプレーン JDBC を使用してデータベース接続を開きます。javax.servlet.Filter
接続をリークしていないことを確認するために、接続を開いたり閉じたりすることができます。HttpServletRequest.setAttribute()
たとえば、 を使用して、接続を request-scope に入れます。これは一部のデータベースでは十分に高速ですが、他のデータベースでは遅すぎる場合があります。
リソース(接続数など)が不足していない場合は、セッションごとに処理することもできます。を使用して、接続をセッション スコープにしHttpSession.setAttribute()
ます。この場合、フィルターでも追加のチェックを行い、接続がまだ有効であることを確認します (これにより、タイムアウト、閉じられたソケットなどを処理します)。セッションが無効になっている場合は、接続を閉じます (これは で実行できますHttpSessionListener
)。
これらは単純なアプローチです。最初のものを改良することができます: リクエスト間で接続を開いたままにし、しばらく非アクティブになった後に閉じます。
最初のオプションについては、いくつかのコード:
フィルター:
@WebFilter("/pages/public/web/filter/dbconn/*")
public class DbConnectionFilter implements Filter {
private final static Db db = new Db();
public void init(FilterConfig fc) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
final HttpServletRequest request = (HttpServletRequest) req;
try {
final Connection conn = db.getConnection(
request.getParameter("user"),
request.getParameter("password"));
try {
request.setAttribute("dbConnection", conn);
chain.doFilter(req, resp);
} finally {
request.removeAttribute("dbConnection");
conn.close();
}
} catch (SQLException e) {
throw new ServletException(e);
}
}
public void destroy() {
}
}
小さなユーティリティ クラスを使用する:
class Db {
private final String jdbcDriver = "org.postgresql.Driver";
private final String jdbcUrl = "jdbc:postgresql://localhost/sandbox";
public Db() {
try {
final Class<?> cls = Class.forName(this.jdbcDriver);
final Driver driver = (Driver) cls.newInstance();
DriverManager.registerDriver(driver);
} catch (Exception e) {
throw new IllegalStateException(e);
}
}
public Connection getConnection(final String jdbcUser,
final String jdbcPassword) throws SQLException {
return DriverManager
.getConnection(this.jdbcUrl, jdbcUser, jdbcPassword);
}
}
そしてあなたのサーブレットで、例えば:
final Connection conn = (Connection) request.getAttribute("dbConnection");
このコードは説明のみを目的としています (使用するrequest.getRemoteUser()
必要があり、パスワードは別の場所に保存する必要があります...)
PostgreSQL を使用してテストしました。その場合、要求ベースで実行するのに十分な速さです。