2014-10-28 2 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: Заявление уже закрыта] [[ACTIVE] ExecuteThread: '8' для очереди: 'weblogic.kernel.Default (self-tuning)'] [2014-10-28 05: 54: 17,918] [ERROR] [com.uprr.app.cpi.dao.CpiCustomerPipelinePreferencesDao: 104] [SQL Exception : java.sql.SQLException: executeQuery, Exception = null] [[ACTIVE] ExecuteThread: '5' для очереди: 'weblogic.kernel.Default (self-tuning)'] [2014-10-28 05:54: 17,918] [ERROR] [com.uprr.app.cpi.web.action. PatternSelectionAction: 112] [Got SQLException при обращении к таблице CPI_CUST_PILN_PREF: ExecuteQuery, Exception = NULL] [[ACTIVE] ExecuteThread: '5' для очереди: 'weblogic.kernel.Default (самонастройки)']

Мои сомнения прост, но я смущен:

Из приведенного выше кода я использую локальный объект подключения или глобальный? Пожалуйста, предложите.

ответ

0

Вы не используете Connection вы open. Это,

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

Должно быть

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

Поскольку экземпляр создается с new cpiDAOBase() не имеет openDbConnection.

+0

Я согласен с вашим предложением. Однако, поскольку из примера кода OP неясно, является ли cpiDAOBase переменной, полем или классом, и это не то же самое, что и имя класса «CpiDaoBase», которое он объявил, я не был бы слишком уверен в том, что код * должен * be. – RealSkeptic

+0

@RealSkeptic Возможно, это выглядит так, как надо, обратите внимание, что 'openDbConnection();' появляется, чтобы установить локальное поле 'Connection con'. –

Смежные вопросы