解决方案 »

  1.   

    没有使用连接池吗?
    如果jdbc连接数据库的话,connection需要手动释放掉,
    还有数据可以分批读取,单次读取量,自己琢磨这来吧
      

  2.   

    1,写一个方法,封装从远程数据库查找一页,然后本地数据库更新一页。
    2,然后根据远程数据的页数进行for循环。
      

  3.   

    当然每次方法执行的时候connection都要关闭
      

  4.   


    有使用数据库,但是因为程序中现在有一次再调用多个这种类似的下载方法,如果调用一次,就close一次connection,好像也会出现问题吧?
      

  5.   

    connection有试过关闭,但是java进程占用的内存还是没有释放
      

  6.   


    有使用数据库,但是因为程序中现在有一次再调用多个这种类似的下载方法,如果调用一次,就close一次connection,好像也会出现问题吧?我的意思是:
    如果你使用c3p0之类的数据库连接池的话,他会自动的处理connection,
    如果你是直接使用的java jdbc的话,那你就要考虑释放connection了
      

  7.   

    你强制执行GC也没那么快释放掉的
    你试试把占内存的对象指向NULL,然后再GC
      

  8.   


    有使用数据库,但是因为程序中现在有一次再调用多个这种类似的下载方法,如果调用一次,就close一次connection,好像也会出现问题吧?我的意思是:
    如果你使用c3p0之类的数据库连接池的话,他会自动的处理connection,
    如果你是直接使用的java jdbc的话,那你就要考虑释放connection了我用的是 jdbc,昨晚也试着加上每次下载完关闭connection,但是内存还是没有释放,所以你还有什么别的建议吗?
      

  9.   

    你所谓的gc是什么意思,System.gc()吗?这个方法没用,又不是马上释放内存
      

  10.   

     for (int iPage = 1; iPage <= iPageCount; iPage++) {
                      StringBuffer strSQL = new StringBuffer();
                      strSQL.append("SELECT * FROM GISFIBER FB WHERE FB.ID IN (SELECT DISTINCT F.ID FROM GISCABLESECTION CS,GISCABLETERM T,")
                      .append("GISFIBER F WHERE (T.ID=CS.ATERMID OR T.ID=CS.ZTERMID) AND CS.ID=F.CABLESECTIONID AND T.REGIONCODE='")
                      .append(region).append("')").append(" ORDER BY FB.ID  LIMIT ").append(pageSize)
                      .append(" OFFSET ").append((iPage - 1) * pageSize);
                       
                      stmt = conn_remote.prepareStatement ( strSQL.toString() ) ;
                      record = stmt.executeQuery () ;
                      YFiber fiber=null;
                      while ( record.next () )
                      {
                          fiber = YObjectConvertor.toFiber(record);
                          GisWrite.create(context, fiber);
                          conn_local.commit();
                      }
                  }写在循环里 得开销很多。