2014-10-28 186 views
0
public class CpiDaoBase { 

protected Connection con = null; 

public void test(){ 
cpiDAOBase.openDbConnection(); 
ps = new cpiDAOBase().con.prepareStatement(INSERT_CARRIER); 
ps.executeQuery(); 
... blah blah blah 
} 

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 CpiDataSource { 
    public static Connection getNonTxConnection() throws CpiSystemException { 
    try { 
     if (nonTxDs == null) 
     { 
      if(log.isDebugEnabled()){ 
       log.debug("nonTxDs is null"); 
      } 
      init(); 
     } 
     return nonTxDs.getConnection(); 
    } catch (NamingException e) 
    { 
     log.error("cpiPoolDataSource is not available !" + e); 
     throw new CpiSystemException("cpiPoolDataSource is not available !"); 
    } catch (SQLException e) 
    { 
     log.error("Failed to get connection from datasource !" + e); 
     throw new CpiSystemException("Failed to get connection from datasource !"); 
    } catch (Exception e) 
    { 
     log.error("Exception \n" + e); 
     throw new CpiSystemException(e.getMessage()); 
    } 
} 
} 

我得到以下异常:值java.sql.SQLException:语句已经关闭

值java.sql.SQLException:语句已经关闭] ​​[[活动] ExecuteThread: '8' for queue:'weblogic.kernel.Default(self-tuning)'] [2014-10-28 05:54:17,918] [错误] [com.uprr.app.cpi.dao.CpiCustomerPipelinePreferencesDao:104] [SQL Exception : java.sql.SQLException:executeQuery,Exception = null] [[ACTIVE] ExecuteThread:'5'for queue:'weblogic.kernel.Default(self-tuning)'] [2014-10-28 05:54: 17,918] [错误] [com.uprr.app.cpi.web.action。 PatternSelectionAction:112] [在访问CPI_CUST_PILN_PREF表时获得SQLException:executeQuery,Exception = null] [[ACTIVE] ExecuteThread:'5'for队列:'weblogic.kernel.Default(self-tuning)']

我的疑问很简单,但我很困惑:

从上面的代码我使用本地连接对象或全球?请建议。

回答

0

您并未使用Connectionopen。这

cpiDAOBase.openDbConnection(); 
ps = new cpiDAOBase().con.prepareStatement(INSERT_CARRIER); 

应该

cpiDAOBase.openDbConnection(); 
ps = cpiDAOBase.con.prepareStatement(INSERT_CARRIER); 

因为你new cpiDAOBase()创建实例不具有openDbConnection

+0

我同意你的第一句话。然而,由于从OP的代码示例中不清楚cpiDAOBase是一个变量,一个字段还是一个类,它不同于他声明的类名“CpiDaoBase”,我不太确定代码*应该是什么*是。 – RealSkeptic 2014-10-28 14:22:56

+0

@RealSkeptic也许*看起来像它*应该注意,'openDbConnection();'似乎设置了一个本地'Connection con'字段。 – 2014-10-28 14:28:01