2012-03-06 2 views
0

Я получаю это исключение SQL:Это связано с утечкой JDBC-соединения?

16043 10.8.38.30> 2012-03-06 14:21:00,870 | INFO | SubThread-10 | DatabaseSender: Executing SQL Statement...; SQL Statement = select ERRORCODE from ERR_MASTER where ErrorDescription='State must be 'pre-installed', 'active', 'inactive' or 'deactive'' 
    16044 10.8.38.30> 2012-03-06 14:21:00,872 | ERROR | SubThread-10 | Exception caught: E_01_003_0 ORA-00933: SQL command not properly ended 
    16045 
    16046 10.8.38.30> 2012-03-06 14:21:00,872 | ERROR | SubThread-10 | SQLState: 42000 
    16047 10.8.38.30> 2012-03-06 14:21:00,872 | ERROR | SubThread-10 | Errorcode: 933 
    16048 10.8.38.30> 2012-03-06 14:21:00,872 | ERROR | SubThread-10 | Exception Stack: 
    16049 10.8.38.30> 2012-03-06 14:21:00,873 | ERROR | SubThread-10 | java.sql.SQLException: ORA-00933: SQL command not properly ended 

Конечно проблема была из ErrorDescription = «Государство должно быть„предварительно установлено“,„активной“,„неактивно“или„Выключена“» имеющими одиночная кавычка в одной кавычки.

Но с учетом приведенного ниже кода это вызывает утечку соединения при возникновении вышеуказанного исключения?

Код выполнения SQL:

private String getErrorCode(Connection conn, PreparedStatement ps, ResultSet result, String sErrorDesc) throws Exception { 
    String sErrorCode = null; 
    StringBuffer sBuffer = new StringBuffer(); 
    sBuffer.append("SELECT ").append(aaConstants.COL_ERRMASTER_ERRORCODE); 
    sBuffer.append(" from ").append(aaConstants.TABLE_ERRMASTER); 
    sBuffer.append(" where ").append(aaConstants.COL_ERRMASTER_ERRORDESCRIPTION); 
    sBuffer.append(" = '").append(sErrorDesc).append("'"); 
    try{ 
     ps = conn.prepareStatement(sBuffer.toString()); 
     Trace.info("sql : " +sBuffer.toString());  
     result = ps.executeQuery(); 

     if (result.next()) 
      sErrorCode = result.getString(aaConstants.COL_ERRMASTER_ERRORCODE); 

    }finally{ 
     aaUtils.cleanUp(null, ps, result); 
    } 
    if (sErrorCode == null || sErrorCode.equals("")) 
     sErrorCode = aaErrorCode.MsgCode_Default_ErrorCode; 

    return sErrorCode; 
}  

Описанный выше метод был назван здесь:

public String getServerExpiredResponse() throws AuthException { 
    String retstr="", sessionid=""; 
    Connection conn = null; 
    PreparedStatement ps = null; 
    ResultSet result = null; 

    if (!loginok) { 

     try{ 
      conn = aaUtils.getDBConnection(); 
      String session_loginfailure_faultcode = getErrorCode(conn, ps, result, sErrorDesc); 
      String session_loginfailure_faultstring = sErrorDesc; 

      if (session_loginfailure_faultcode==null) {session_loginfailure_faultcode="";} 
      if (session_loginfailure_faultstring==null) {session_loginfailure_faultstring="Failed.";} 
      retstr += 
       "<faultcode>" 
        + session_loginfailure_faultcode 
       + "</faultcode>" 
       + "<faultstring>" 
        + session_loginfailure_faultstring 
       + "</faultstring>"; 

     } catch (Exception e) { 
      throw new AuthException(Trace.stack2string(e)); 
     }finally{ 
      aaUtils.cleanUp(conn, ps, result); 
     } 
    } 
    Trace.info("In getServerExpiredResponse " +retstr); 
    return retstr; 
} 

Соединение DB была близка в вызывающем методе getErrorCode(), так как исключение произошло в getErrorCode (), будет ли соединение еще близко в getServerExpiredResponse()?

Вы можете видеть, что внутри getErrorCode() только объекты Resultset и PreparedStatement близки.

ответ

0

Но с учетом приведенного ниже кода возникает ли утечка соединения при возникновении вышеуказанного исключения?

Это зависит от того, что aaUtils.cleanUp(null, ps, result). Если он закрывает оператор и результирующий набор, то вы не должны получать утечку ресурсов.

+0

Спасибо Стивен. Да. Utils закрывает утверждения и набор результатов. – digeratz

0

Проблема Single Quotes в sql запросе. В sql, когда мы хотим написать кавычки, вам нужно написать два кавычки: ' ==>> ''. для использования Single Quotes в SQL Query вы должны использовать еще две цитаты следующим образом:

String sErrorCode = null; 
StringBuffer sBuffer = new StringBuffer(); 
sBuffer.append("SELECT ").append(aaConstants.COL_ERRMASTER_ERRORCODE); 
sBuffer.append(" from ").append(aaConstants.TABLE_ERRMASTER); 
sBuffer.append(" where ").append(aaConstants.COL_ERRMASTER_ERRORDESCRIPTION); 
sBuffer.append(" = '''").append(sErrorDesc).append("'''"); 

Более подробное описание: при выполнении Ваш SQL следующим образом:

select ERRORCODE from ERR_MASTER where ErrorDescription='State must be ''pre-installed'', ''active'', ''inactive'' or ''deactive''' 

Ошибка SQL двигатель броска: SQL command not properly ended

, но когда вы выполните следующий запрос sql all fine:

выберите ERRORCODE из ERR_MASTER где ErrorDescription = «» Государство должно быть «» предварительно установлен «», «» активный «», «» неактивным «» или «» дезактивировать «»

для получения дополнительной информации см http://it.toolbox.com/wiki/index.php/How_do_I_escape_single_quotes_in_SQL_queries%3F

+0

Спасибо MJM. Но моя главная проблема заключается в том, что исключение SQL выше может вызвать утечку JDBC-соединения с использованием заданных кодов? – digeratz

+0

Нет, ваш журнал говорит: 'SQL-команда не правильно закончена', и эта ошибка для неправильного SQL-запроса. – MJM

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