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请求)
答案 0 :(得分:0)
con
实例变量的生命周期取决于A
和B
实例的生命周期。如果没有关于con
和A
实例的方式的信息,是否(或者不是)每个servlet是否有一个B
实例是不可能的任何创建和使用。
但是,您的代码中明显存在错误。您必须使用con
中的声明来对B
中的声明进行不同的声明,并在A
中隐藏声明。当您致电openDbConnection()
时,它会为A.con
分配一个值...但是当您致电executeQuery()
时,代码会引用仍为B.con
的{{1}}。这可能是你“怀疑”的原因。
答案 1 :(得分:0)
我同意@Stephen C,因为你的代码有错误。 但是把它放在一边,我想你的陈述,
b = new B();
在这里有所不同。每次创建一个具有自己的con
对象的B的新实例时。所以,是的,每个新请求都将创建一个新对象,从而创建一个新连接。