2014-10-29 46 views
0
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請求時,它會創建線程)類級變量將由所有servlet請求共享嗎?

+0

您必須閱讀這篇文章http://yiyujia.blogspot.in/2011/12/on-my-post-about-java-class-loader-i.html – 2014-10-29 09:32:28

回答

0

的壽命con實例變量取決於AB實例的生存期。不可能說什麼關於是否(或沒有)每個servlet將有一個con實例,而沒有關於如何創建和使用AB實例的信息。

但是,代碼中顯然存在一個錯誤。您必須清楚地聲明conB中的聲明,以此暗示A中的聲明。當您撥打openDbConnection()時,它將爲A.con分配一個值...但是當您撥打executeQuery()時,代碼指的是B.con,它仍然是null。這可能是你「懷疑」的原因。

0

我同意@Stephen C,就是說你的代碼有一個bug。 但留下不談,我認爲你的說法,

b = new B(); 

使得這裏的區別。每次創建一個具有自己的con對象的新實例B.所以是的,每個新的請求都會創建一個新的對象,從而創建一個新的連接。