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条)

报告相同问题?

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考