Это вызывает утечку JDBC-соединения? - PullRequest
0 голосов
/ 06 марта 2012

Я получаю это исключение SQL:

  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;
}

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

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

Ответы [ 2 ]

0 голосов
/ 06 марта 2012

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

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

0 голосов
/ 06 марта 2012

Проблема 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 запроса все нормально:

выберите ERRORCODE из ERR_MASTER, где ErrorDescription = '' Состояние должно быть '' предустановлено '', '' активно '', '' неактивно '' или '' неактивно ''

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

...