2015-11-23 1 views
0

Я начал получать множество предупреждений всякий раз, когда я перезапускаю свой сервер в последнее время. Предупреждение выглядит следующим образом:resultset.getTimestamp и предупреждение ThreadLocal Java

веб-приложение [/ ххх] создал ThreadLocal с ключом типа [net.sourceforge.jtds.jdbc.Support $ 1] (значение [net.sourceforge.jtds.jdbc.Support $ 1 @ 29173d71]) и значение типа [java.util.GregorianCalendar] ... , но не удалось удалить его, когда веб-приложение было остановлено.

я наконец-то нашел строку в коде, который создает это:

cp.setCreationDate (rset.getTimestamp ("CreationDate"));

RSET имеет тип java.sql.ResultSet

Есть ли что-то не так с тем, как я получаю дату из базы данных или есть способ, чтобы удалить календарь? Мы всегда делали это так, и я не знаю, почему эти ошибки начались, но они действительно спам журналов.

Я нашел эту тему: Java ResultSet.getTimestamp using Calendar & Thread safety

, но я все еще получаю ошибки.

+0

Какой тип cp? Проверьте API для метода setCreationDate и посмотрите, есть ли способ очистить информацию, хранящуюся в этом методе. Затем вам нужно будет вызвать этот другой метод, когда сервер выключится. –

+0

Привет, спасибо за ваш ответ. Однако cp - это просто класс. Если я меняю строку на: Timestamp i = rset.getTimestamp ("CreationDate"); Ошибка все еще есть – Johannes

ответ

1

Позвоните по номеру rset.close() после того, как вы закончили с самим объектом ResultSet, который освободит ресурсы, на которые удерживает ResultSet.

+0

Я действительно закрываю ее. Добавлено новое сообщение над этим. – Johannes

+0

Из кода, который вы отправили в качестве ответа, если rset.getTimestamp() выбрасывает SQLException, то вызов rset.close() не будет вызван. Попробуйте поместить все вызовы close() в блок finally. –

+0

Эй, ты прав, но это не проблема. Ошибок не обнаружено, и приложение работает нормально. Его только эти предупреждения, появившиеся из ниоткуда. Теперь я думаю, что это должно быть связано с окружающей средой, а не с самим кодом. Что-то с java-версией или импортными банками или чем-то, что что-то путает. Я понимаю, что это невозможно для любого, кто может помочь с данными, которые у меня есть, поэтому я оставлю эту тему сейчас. Если я когда-нибудь узнаю об этом, я добавлю какие-либо решения по моему вопросу. – Johannes

0

Я закрыл набор результатов. Это код сейчас (упрощено, чтобы просто показать мою проблему):

public CompanyPerson getCompanyPerson(int personId) throws SQLException {   
    CompanyPerson person = new CompanyPerson(); 
    Connection con = null; 
    PreparedStatement pstmt = null; 
    ResultSet rset = null; 

    StringBuffer sql = new StringBuffer(); 
    sql.append(" select CreationDate from CMCompanyPeople person "); 
    sql.append(" where person.PersonId=?");   

    try { 
     con = dataSource.getConnection(); 
     pstmt = con.prepareStatement(sql.toString()); 
     pstmt.setInt(1,personId); 

     rset = pstmt.executeQuery(); 

     if (rset.next()) { 
      Timestamp t = rset.getTimestamp("CreationDate"); 
     } 

     rset.close(); 
     pstmt.close(); 
     con.close();   

    } catch (SQLException e) { 
     throw e; 
    } finally { 
     closeConnection(con); 

    } 

    return person; 
} 

Когда я запускаю код сервер перезагружен, и я получил вышеуказанную ошибку.

После удаления следующего кода я не получил какие-либо ошибки

Отметка т = rset.getTimestamp ("CreationDate");

Что здесь происходит?

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