【问题标题】:resultset.getTimestamp and ThreadLocal warning Javaresultset.getTimestamp 和 ThreadLocal 警告 Java
【发布时间】:2015-11-23 23:31:59
【问题描述】:

我最近每次重新启动服务器时都会收到很多警告。 警告如下所示:

Web 应用程序 [/xxx] 创建了一个 ThreadLocal,其键类型为 [net.sourceforge.jtds.jdbc.Support$1](值 [net.sourceforge.jtds.jdbc.Support$1@29173d71]),值为类型 [java.util.GregorianCalendar] ... 但在 Web 应用程序停止时未能将其删除。

我终于在代码中找到了创建它的那一行:

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

rset 是 java.sql.ResultSet 类型

我从数据库中获取日期的方式是否有问题,或者有没有办法删除日历? 我们一直都是这样做的,我不知道为什么会出现这些错误,但它们现在确实是垃圾日志。

我找到了这个帖子: Java ResultSet.getTimestamp using Calendar & Thread safety

但我仍然收到错误。

【问题讨论】:

  • cp是什么类型的?检查 setCreationDate 方法的 API,看看是否有办法清除该方法存储的信息。然后,您需要在服务器关闭时调用此其他方法。
  • 您好,感谢您的回复。然而 cp 只是一些类。如果我将行更改为: Timestamp i = rset.getTimestamp("CreationDate");错误依然存在

标签: java timestamp resultset thread-local


【解决方案1】:

在您完成 ResultSet 对象本身后调用 rset.close(),这将释放 ResultSet 持有的资源。

【讨论】:

  • 我相信我会关闭它。在此上方发布了一个新帖子。
  • 从您作为答案发布的代码中,如果 rset.getTimestamp() 抛出 SQLException,则不会调用 rset.close()。尝试将所有 close() 调用放在 finally 块中。
  • 嘿,你是对的,但这不是问题所在。没有发现错误,应用程序工作正常。只是这些警告突然出现了。我现在认为它与环境有关,而不是代码本身。带有 java-version 或导入的 jar 的东西,或者一些搞砸的东西。我意识到,鉴于我所掌握的信息,任何人都无法提供帮助,所以我现在将离开这个帖子。如果我对此有所了解,我会为我的问题添加任何解决方案。
【解决方案2】:

我关闭了结果集。 这是现在的代码(简化以显示我的问题):

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

当我运行代码时,服务器重新启动并出现上述错误。

删除以下代码后,我没有收到任何错误

时间戳 t = rset.getTimestamp("CreationDate");

这是怎么回事?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-04
    • 1970-01-01
    • 2013-07-30
    • 2014-03-28
    • 2016-02-28
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    相关资源
    最近更新 更多