类级变量将由所有servlet请求共享?

时间:2014-10-29 09:19:22

标签: java servlets struct

public class A {
protected Connection con = null;
public void openDbConnection() throws CpiSystemException {
        try {
            if (con == null || con.isClosed()) {
                con = CpiDataSource.getNonTxConnection();
            }
        } catch (SQLException e) {
            log.error(e.getMessage(), e);
            new CpiSystemException("SQLException caused by con.isClosed(): " + e.getMessage());
        }
    }
}
public class B extends A {
private Connection con;
// if two servlets requests came to execute below method, both will use same connection object or will create different objects?
public void executeQuery(){
openDbConnection();
con.prepareStatement(SELECT_CUST_PILN_PREF_BY_CRTN_USER_ID);
}
}
public class C extends HttpServlet {
B b = null;
init(){
}
doget(request, response){
b = new B();
b.executeQuery();
}
}

我怀疑是: 对于每个servlet请求,将创建一个连接对象,或者为所有servlet请求创建相同的连接对象(我们知道它将创建线程的每个servlet请求)

2 个答案:

答案 0 :(得分:0)

con实例变量的生命周期取决于AB实例的生命周期。如果没有关于conA实例的方式的信息,是否(或者不是)每个servlet是否有一个B实例是不可能的任何创建和使用。

但是,您的代码中明显存在错误。您必须使用con中的声明来对B中的声明进行不同的声明,并在A中隐藏声明。当您致电openDbConnection()时,它会为A.con分配一个值...但是当您致电executeQuery()时,代码会引用仍为B.con的{​​{1}}。这可能是你“怀疑”的原因。

答案 1 :(得分:0)

我同意@Stephen C,因为你的代码有错误。 但是把它放在一边,我想你的陈述,

b = new B();

在这里有所不同。每次创建一个具有自己的con对象的B的新实例时。所以,是的,每个新请求都将创建一个新对象,从而创建一个新连接。