-1

以下のコードは、プロジェクトで使用する「ベース」サーブレットです。

public class MyServlet extends Servlet {
    private static final long serialVersionUID = 1L;

    protected Connection conn;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public MyServlet() {
        super();
    }

    protected void connectDB() throws NamingException, SQLException {
        // get database settings

        InitialContext cxt = new InitialContext();

        DataSource ds =(DataSource)cxt.lookup( "java:/comp/env/jdbc/MyDB" );
        conn = ds.getConnection();      
    }

    protected void closeDB() throws SQLException {
        try {
            if (conn!=null) conn.close();
        }
        finally {
            conn = null;
        }
    }

    protected void addCacheControl(HttpServletResponse response) {
        response.setHeader("Expires", "Thu, 01 Jan 1970 00:00:00 GMT");
        response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate, pre-check=0, post-check=0");
        response.setHeader("Pragma", "no-cache");
    }

}

たとえばSomeServlet extends MyServlet...

SomeServletこれで、ブラウザでforward()JSP ページにアクセスし、一定期間 (たとえば 10 秒) 更新します。

ページが開いてしばらくすると、このコードは NullPointerException をスローします。

stmt = conn.prepareCall("{call sp_someSP(?, ?, ?)}");
4

1 に答える 1

1

複数のスレッドで共有されるため、このようにサーブレットのインスタンス フィールドを使用することはできません。

プログラムを介してパラメーターとローカル変数として接続を明示的に渡す必要があります (それらがスタック上に存在し、各スレッドが独自のバージョンを取得するようにするため)、またはより「グローバルな」アプローチが必要な場合は ThreadLocal を使用することもできます。ThreadLocal 接続は、リクエストが完了したときに ServletFilter によって確実に閉じることもできます。

于 2012-12-19T08:52:02.497 に答える