【问题标题】:Designing DataSource Connection for Concurrency为并发设计数据源连接
【发布时间】:2012-12-19 08:44:26
【问题描述】:

以下代码是我们用于项目的“基础”servlet:

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 是在浏览器中访问它对JSP 页面执行forward() 然后刷新一段时间(比如10 秒)

页面打开一段时间后,此代码抛出 NullPointerException:

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

【问题讨论】:

    标签: java jsp servlets jdbc concurrency


    【解决方案1】:

    你不能像这样使用 Servlet 的实例字段,因为它会被多个线程共享。

    您需要通过程序显式传递连接作为参数和局部变量(以便它们存在于堆栈中,并且每个线程都有自己的版本),或者如果您想要更“全局”,可以使用 ThreadLocal方法。当您的请求完成时,ServletFilter 也可以可靠地关闭 ThreadLocal 连接。

    【讨论】:

    • 你的意思是从 'SomeServlet' 我不应该访问 'conn'... 比如 stmt = conn.prepareCall("{call sp_someSP(?, ?, ?)}"); ?
    • 不,我的意思是,conn 字段根本不应该存在。它应该是一个局部变量或一个 ThreadLocal。
    • 好的,但是 SomeServlet 大部分时间都可以工作; conn 有时只是空
    • 我的意思是在浏览器的多个选项卡中同时访问 servlet 时
    • 是的,这正是这里的问题。您的代码不是线程安全的。如果你想让它在“大部分时间”之外工作,你需要摆脱非线程安全的共享状态。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-13
    • 1970-01-01
    • 2016-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-24
    相关资源
    最近更新 更多