2010-11-14 80 views
2

亲爱的, 我使用Java RMI的我的程序,从客户端我打电话通过传递一个参数我的接口方法。使用该参数接口运行查询并返回40,000行(每行包含10行)。所有这些都存储在向量结构[[0,1,2,3,4,5,6,7,8 ,9],[],[],[],[],[] ...]。当我点击一个按钮时会发生这种情况。第一次它的作品,但我也试图做同样的事情(即单击按钮)它显示客户端的内存异常java.lang.out。请帮助我。我正在使用Postgresql数据库。内存溢出异常的RMI

Client side: 
    Vector data = new Vector(); 
    data = Inter.getEndProductDetailsForCopyChain(endProductId); 

Server side: 
    public Vector getEndProductDetailsForCopyChain(int endProductId1) 
    { 
     Connection OPConnect = StreamLineConnection.GetStreamline_Connection(); 
     Vector data=new Vector();  
     try{   
      System.out.println("Before query data vector size>>>>>>>>"+data.size());//mohan 
      String sqlQry = "select distinct style_no,version_no,matNo,type,specs,color,size,ref_no,uom1 from garment where id=" +endProductId1; 
      System.out.println("sqlQry"+ sqlQry); 
      Statement st=OPConnect.createStatement(); 
      ResultSet rs = st.executeQuery(sqlQry); 
      while(rs.next()){ 
       Vector row = new Vector(); 
       row.add(rs.getString("style_no")); 
       row.add(rs.getString("version_no")); 
       row.add(rs.getString("matNo")); 
       row.add(rs.getString("type")); 
       row.add(rs.getString("specs")); 
       row.add(rs.getString("color")); 
       row.add(rs.getString("size")); 
       row.add(rs.getString("ref_no")); 
       row.add(rs.getString("uom1")); 
       row.add(new Boolean(false)); 
       data.add(row); 
       } 
      System.out.println("After query data vector size>>>>>>>>"+data.size()); 
     }catch(Exception e) 
     { e.printStackTrace(); 
      closeConnection(OPConnect); 
     } 
      return data; 
     } 

我清除了所有的向量和整理我的过程,但仍然在客户端抛出内存异常终止后的HashMap时的数据(查询结果向量)分发到客户端发生这种情况。

+1

你为什么要在内存中加载如此庞大的数据? – 2010-11-14 11:11:31

+0

根据需要它是必要的。我只给了一个示例查询。真的那是一个巨大的查询。 – Mohan 2010-11-14 11:19:51

+0

我认为你是在服务器上使用PostgreSQL的事实是不相干......”刚说,消除因素为您服务。 – 2010-11-14 11:25:06

回答

0

尝试重新使用data,不产生对每个请求一个新的载体。 data.clear(); // fill it then

+0

谢谢,我应该在哪里添加这条线在客户端或服务器上 – Mohan 2010-11-14 11:17:21

+0

@Mohan在服务器和客户端,我不确定它会帮助避免,但每创建一个'new Vector()'时间会给垃圾收集器带来负担,org.life.java的问题是关键:为什么你需要将它加载到内存中? – khachik 2010-11-14 11:20:17

+0

是否可以在不加载到内存的情况下执行此操作。可以给出解决方案。 – Mohan 2010-11-14 11:23:11

1

你的问题的直接回应:如果你可以改变客户端JVM的命令行参数,然后分配更多的内存启动。例如,使用-Xmx256M可以使用256兆的最大内存。

对您的问题更有用的回答:您说出问题的方式表明您知道真正的问题:一种程序架构,它试图获得如此多的数据单击。你真的需要在客户端有这么多的数据吗?你可以在服务器端进行一些处理,并发送更少的?你可以添加分页吗?或延迟加载?

考虑谷歌的搜索模式作为一个可能的解决方案...谷歌搜索“你好”拥有约310,000,000比赛,但谷歌只给我发10个结果的时间。然后我点击“下一步”以获得更多...这是分页。用户通常无法一次对40,000行数据有太多意义。这对你有用吗?

如果这是用于出口,同时取得100行左右,导出,然后再读取下一行...你真的不希望被通过RMI在一个呼叫转移如此多的数据。

+0

雅好的提示我会试试这个。非常感谢。 – Mohan 2010-11-14 11:29:19

+0

非常感谢史蒂夫。 – Mohan 2010-11-14 12:21:52