开发者社区 问答 正文

JDBC 大数据量查询内存溢出? 400 报错

JDBC 大数据量查询内存溢出? 400 报错

执行一个大概不到30W的表,查询的字段均使用了索引,但是使用JDBC查询,内存溢出

 public List findFuncListForJDBC2(String sql) {
  FileLogger.getLogger().warn("执行查询SQL:" + sql);
  Connection myConn = null;
  PreparedStatement pstmt = null;
  ResultSet rs = null;
  List lstResult = new ArrayList();
  try {
   myConn = getJdbcSqlMap();
   pstmt = myConn.prepareStatement(sql, ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
   pstmt.setFetchSize(1000);
   rs = pstmt.executeQuery();
   ResultSetMetaData dat = rs.getMetaData();
   int i = 0;
   HashMap map = null;
   while (rs.next()) {
    i++;
    map = new HashMap();
    for (int j = 1; j <= rs.getMetaData().getColumnCount(); j++) {
     map.put(dat.getColumnName(j).toString(), rs.getObject(j));
    }
    lstResult.add(map);
   }

   return lstResult;
  } catch (SQLException sqlexception) {
   FileLogger.getLogger().error("执行查询出错!", sqlexception);
   throw new DaoException("Error getLeftModule.  Cause: " + sqlexception);
  } finally {
   try {
    if (rs != null)
     rs.close();
    if (pstmt != null)
     pstmt.close();
    if (myConn != null && !myConn.isClosed())
     myConn.close();
   } catch (SQLException e) {
    FileLogger.getLogger().error("释放资源出错!", e);
   }

  }
 }

异常信息如下:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

 

展开
收起
爱吃鱼的程序员 2020-06-03 16:49:24 1340 分享 版权
1 条回答
写回答
取消 提交回答
  • https://developer.aliyun.com/profile/5yerqm5bn5yqg?spm=a2c6h.12873639.0.0.6eae304abcjaIB

    堆溢出啊,这和JDBC查询没关系,主要是加载到内存的数据对象太多,导致。把JVM内存设置大些######除了这个方式,能否在代码上进行优化?######

    数据库是mysql?

    ######oracle######

    引用来自“爪哇老妖”的答案

    堆溢出啊,这和JDBC查询没关系,主要是加载到内存的数据对象太多,导致。把JVM内存设置大些
    可以啊,代码方面就控制住对象生成数量即可。不要一次生成太多对象。
    ######嗯,主要是查询,我做成分页的方式来查,但是效率会比较低######分页,优化代码。######我目前就是采用这种方式,但是效率比较低######代码优化还是老调重弹吧,不要在循环里面做使用资源的事情######

    引用来自“爪哇老妖”的答案

    引用来自“爪哇老妖”的答案

    堆溢出啊,这和JDBC查询没关系,主要是加载到内存的数据对象太多,导致。把JVM内存设置大些
    可以啊,代码方面就控制住对象生成数量即可。不要一次生成太多对象。
    额  可以在数据库层面使用SQL分页
    ######这个是肯定的,但是会导致效率比较低######

    Java语言的意义就在于提醒你,不要写垃圾代码,注意控制好内存和性能。。


    ######这些道理其实大家都懂,就像有个人跟你说我要解决温饱,但是你说党的优越性一样######

    引用来自“爪哇老妖”的答案

    引用来自“爪哇老妖”的答案

    引用来自“爪哇老妖”的答案

    堆溢出啊,这和JDBC查询没关系,主要是加载到内存的数据对象太多,导致。把JVM内存设置大些
    可以啊,代码方面就控制住对象生成数量即可。不要一次生成太多对象。
    额  可以在数据库层面使用SQL分页
    建索引,尽量使用索引查询,SQL优化,拆表等一些列优化措施都用上,实在不行做数据缓存,ehcache等
    2020-06-03 20:46:11
    赞同 展开评论