TisonWomg 2018-11-27 07:29 采纳率: 100%
浏览 1411
已采纳

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

大致步骤是读取一个包含十六万+行的文档数据,并将数据存放到数据库,但是在该方法执行完成后所占用的内存资源没有被释放,求大神指教~
(这程序是用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条回答 默认 最新

  • 千秋无痕 2018-11-27 09:31
    关注

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

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?
  • ¥15 求daily translation(DT)偏差订正方法的代码
  • ¥15 js调用html页面需要隐藏某个按钮