0

私は現在、Java EE Web アプリケーションを構築していますが、この記事を見つけて、より優れたアプリケーションを構築する方法についていくつかのヒントを得ることができました。最初のヒントは、「HttpServlet init() メソッドを使用してデータをキャッシュする」です。これは天才的なアイデアのように聞こえますが、独自のバージョンを実装した今、スレッドの安全性と接続を開いたままにしておくことが怖いです。

  1. このアイデアと、各スレッドに独自のデータベース接続があることを確認するためにスレッドセーフを実装した方法はありますか?
  2. JNDIルックアップを変更したいときはいつでも、これにはサーブレットの再起動が必要であることを理解しています。それで問題ありませんが、JDBCメソッドでJNDIルックアップを実行するだけでなく、他に欠点はありますか?
  3. コンテキスト変数を閉じるために destroy メソッドを使用した方法は賢明なアイデアですか、それとも大量のスレッドやその他の障害があるとうまくいかないのでしょうか?

このアイデアをどのように実装したかを示すコードを次に示します。これを他の 40 個のサーブレットに実装する前に、最初の実装に関するガイダンスが欲しいだけです。読んでいただきありがとうございます。ああ、それが役に立ったら、dao メソッドも追加できます。

サーブレットに関する注意事項: init 内では、複数のサーブレットに簡単に追加できるようにするために、JNDI のすべてを処理する Bean を呼び出すだけです。次に、サーベルトで、データソースを使用する dao メソッドに送信します。また、サーバーの起動時に JNDI がすぐに機能するかどうかを確認できるように、起動時に負荷を追加するのも賢明だと思いました。

@WebServlet(name="GetBoardPostCommenters", urlPatterns={"/getBoardPostCommenters"}, loadOnStartup = 1)
public class GetBoardPostCommenters extends HttpServlet
{
    private InstrideJndi jndi = null;
    private static final long serialVersionUID = 1L;

    public void init(ServletConfig servletConfig) throws ServletException
    {
        super.init(servletConfig);
        jndi = new InstrideJndi("GetBoardPostCommenters");
    }

    public void destroy()
    {
        jndi.closeConnection();
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException
    {
        BoardPost boardPost;

        boardPost = new BoardPost();
        boardPost.setId(Long.parseLong(request.getParameter("boardPostId")));
        boardPost = BoardPostCommentLikeDAO.getBoardPostCommenters(boardPost, jndi.getDataSource());

        request.setAttribute("likerCommenterList", boardPost.getCommenterList());
        request.getRequestDispatcher("WEB-INF/util/likerCommenterList.jsp").forward(request, response);
    }
}

Bean に関する注意事項:コントローラーは、このメソッドを呼び出したサーブレットの名前を取得して、デバッグを支援します。そして、密接な接続は、dao メソッドの finally で通常行うことを行います。

public class InstrideJndi
{
    private DataSource dataSource = null;
    private Context initialContext = null;
    private Context environmentContext = null;

    public InstrideJndi(String className)
    {
        try
        {
            this.initialContext = new InitialContext();
            this.environmentContext = (Context) initialContext.lookup("java:/comp/env");
            this.dataSource = (DataSource) environmentContext.lookup("jdbc/instride");
        }
        catch(NamingException error)
        {
            System.out.println("Error With JNDI Lookup -  " + className + " - " + error.getMessage());
            error.printStackTrace();
        }
    }

    public DataSource getDataSource()
    {
        return this.dataSource;
    }

    public void closeConnection()
    {
        if (initialContext != null) try{initialContext.close();} catch(NamingException ignore) {}
        if (environmentContext != null) try{environmentContext.close();} catch(NamingException ignore) {}
    }
}
4

1 に答える 1