1

Java EE Web アプリケーションを開発しています。Web アプリケーションが JDBC 接続プールを使用することを希望します。

アプリケーション サーバーで DataSource を定義するのは非常に簡単です。私の問題は、すべてのデータベース接続が同じ資格情報 (ユーザー/パスワード) で作成されていることです。必要なのは、Web アプリケーションにアクセスしているユーザーに応じて、アプリケーションがユーザーの資格情報を使用してデータベース接続を取得することです。 Web アプリケーションにアクセスしたもの。

JBoss アプリケーション サーバーと Oracle データベースを使用しています。

4

1 に答える 1

1

データ ソースと共にすぐに使用できるソリューション (構成のみ) については知りません。

しかし、あなたはそれを実装することができます.これらのアプローチを見てください:

  • 要求ごとにプレーン 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 を使用してテストしました。その場合、要求ベースで実行するのに十分な速さです。

于 2013-09-02T16:05:46.450 に答える