日期:2014-05-20  浏览次数:20725 次

try-with-resources的使用问题

try(ResultSet rs=ps.getResultSet()){
 //省略
}

java.sql.ResultSet有接口AutoCloseable,以上代码在jre7下运行没有错误,貌似一切正常。
但我通过jmap检查内存泄露时却发现com.microsoft.sqlserver.jdbc.TypeInfo、com.microsoft.sqlserver.jdbc.Column占用了大量内存(这是jdbc-sqlserver驱动中的类型),且对象量持续上升。
我怀疑rs根本没被close掉,于是在try块中加了rs.close();
结果正如我猜的那样,内存泄露的情况没有了。

这是我使用上有什么问题?还是try-with-resources有问题?

------解决方案--------------------
引用:
这货木有人用过么?jdk7还不是太普及阿

jdk7的东西吗?确实没用过
------解决方案--------------------
OH   jdk7还真没有用过。好像增加了不少新的东西。ResutlSet肯定是需要关闭的嘛,这能有什么问题呢?
------解决方案--------------------
你不关闭肯定会这样啊。。一定要关闭 最好放在finally块里
------解决方案--------------------
换个数据库试试,看看是jre的问题,还是M$ jdbc驱动的问题
------解决方案--------------------
public static void viewTable(Connection con) throws SQLException {

    String query = "select COF_NAME, SUP_ID, PRICE, SALES, TOTAL from COFFEES";

    try (Statement stmt = con.createStatement()) {

      ResultSet rs = stmt.executeQuery(query);

      while (rs.next()) {
        String coffeeName = rs.getString("COF_NAME");
        int supplierID = rs.getInt("SUP_ID");
        float price = rs.getFloat("PRICE");
        int sales = rs.getInt("SALES");
        int total = rs.getInt("TOTAL");
        System.out.println(coffeeName + ", " + supplierID + ", " + price +
                           ", " + sales + ", " + total);
      }

    } catch (SQLException e) {
      JDBCTutorialUtilities.printSQLException(e);
    }
  }



看官方例子
http://docs.oracle.com/javase/7/docs/technotes/guides/language/try-with-resources.html

不知道你代码是不是写错了.