weixin_41803476
TisonWomg
采纳率100%
2018-11-27 07:29 阅读 1.3k
已采纳

Java读取文本数据存到数据库,在方法执行完成后为啥所占用的内存资源没释放?

20

大致步骤是读取一个包含十六万+行的文档数据,并将数据存放到数据库,但是在该方法执行完成后所占用的内存资源没有被释放,求大神指教~
(这程序是用swing开发的桌面程序,不知是不是跟用了swing有关)

以下代码是核心部分:


        String sql = "insert into "+tableName+"("+imuField+") values(?,?,?,?,?,?,?,?,?)";
        Connection c = JDBCUtil.getConnection(); // 获取数据库连接
        try {
            Statement statement=c.createStatement(); 
            statement.executeUpdate(createTable); // 创建表
            System.err.println(tableName+"表创建成功,准备写入数据...");
            c.setAutoCommit(false); // 手动提交
            PreparedStatement ps= c.prepareStatement(sql);
            File imuFile= new File(file);
            List<String> strList=FileIUtils.readLine(imuFile,"utf-8", index, offset); // 读取文件内容
            if(strList==null || strList.size()<1) {
                SwingUtils.warn(jf, null, "选择的文件不存在IMU数据");
            }
            Integer n=0;
            Integer not=0;
            Integer i= 0;
            StringBuilder utcTime = new StringBuilder();
            String[] strs = new String[1024];
            long begin = System.currentTimeMillis(); // 记录开始时间
            jProgressBar.setMaximum(strList.size()); // 加载进度条
            for(String strLin: strList) {
                n++;
                i++;
                jProgressBar.setValue(n); // 加载进度条
                strs = strLin.split("\t");
                if(strs[0]!=null && Utils.isContainNumber(strs[0])
                        && strs[1]!=null &&  Utils.isContainNumber(strs[1])
                        && strs[2]!=null && Utils.isContainNumber(strs[2])
                        && strs[3]!=null && Utils.isContainNumber(strs[3])
                        && strs[4]!=null && Utils.isContainNumber(strs[4])
                        && strs[5]!=null && Utils.isContainNumber(strs[5])
                        && strs[6]!=null && Utils.isContainNumber(strs[6])
                        && strs[7]!=null && Utils.isContainNumber(strs[7])
                        && strs[8]!=null && Utils.isContainNumber(strs[8])) {
                    Date GpsDate = Utils.StringToDate(strs[1]+" "+strs[0]); // GPS时间处理(0,1元素拼接起来为GPS时间)
                    ps.setDate(1,new java.sql.Date(GpsDate.getTime())); 
                    ps.setLong(2, GpsDate.getTime());
                    ps.setString(3, strs[2]);
                    ps.setString(4, strs[3]); 
                    ps.setString(5,strs[4]);    
                    ps.setString(6, strs[5]);   
                    ps.setString(7, strs[6]);   
                    ps.setString(8, strs[7]);   
                    utcTime.setLength(0);   
                    utcTime.append(strs[1]).append(" "+strs[8]);
                    ps.setString(9, utcTime.toString());
                    ps.addBatch();
                    if(i>=100000) { // 累计到十万条时执行SQL
                        i=0;
                        ps.executeBatch();
                        c.commit();
                    }
                }else {
                    not++;
                    continue;
                }
            }
            if(ps!=null) {
                ps.executeBatch();
                ps.close();
                c.commit();
            }
            System.out.println("插入完成,耗时约 "+(System.currentTimeMillis()-begin)/1000+" 秒");
        } catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeConnection(c); // 回收连接
        }

以下是程序启动时内存占用情况:
程序启动时

以下是程序执行SQL方法时内存的占用情况:
运行中

以下是该方法执行完成后内存占用情况(与运行中差不多,或更高):
完成后

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

3条回答 默认 最新

  • 已采纳
    falali19880120 千秋无痕 2018-11-27 09:31

    先提交事务之后,在进行ps关闭;
    statement也进行关闭下
    同时在list使用完毕后清理下
    最后把有close方法的都搞上

    点赞 评论 复制链接分享
  • new_lol new_lol 2018-11-27 16:15

    我记得java的自动回收机制并不是销毁了就释放好像

    点赞 评论 复制链接分享
  • lovehehe87 lovehehe87 2018-11-28 01:51

    1、statement对象也关闭下
    2、看一下FileIUtils.readLine方法,是否打开了imuFile文件对象未关闭

    点赞 评论 复制链接分享

相关推荐