亲爱的, 我正在使用java rmi作为我的程序,从客户端我通过传递单个参数调用我的接口方法。使用此参数接口运行查询并返回40,000行(每行包含10行)。所有这些都存储在向量结构中的向量[[0,1,2,3,5,5,7,8]中,9],[],[],[],[],[] ...]。当我点击一个按钮时会发生这种情况。第一次它的工作,但我再次尝试做同样的(即点击按钮)它显示客户端的内存异常的java.lang.out 。请帮帮我。我正在使用Postgresql db。
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,但仍然在客户端丢失了内存异常,当数据(查询结果向量)发送到客户端时会发生这种情况。
答案 0 :(得分:1)
对您的问题的直接回复:如果您可以更改客户端JVM命令行参数,则从分配更多内存开始。例如,使用-Xmx256M使用256 Meg
的最大内存对您的问题的一个更有用的回答:你提出问题的方式表明你知道真正的问题:一个程序架构试图通过一次点击获得如此多的数据。你真的需要在客户端有这么多的数据吗?你可以在服务器端进行一些处理并发送少得多吗?你能添加分页吗?还是懒加载?
将Google的搜索模型视为可能的解决方案......谷歌搜索“hello”有大约310,000,000个匹配,但Google一次只向我发送10个结果。然后我点击“下一步”获取更多...这是分页。用户通常不能同时理解40,000行数据。这对你有用吗?
如果这是用于导出,一次获取100行左右,导出它们,然后获取下一行......你真的不希望在一次调用中通过RMI传输这么多数据。
答案 1 :(得分:0)
尝试重用data
,不要在每个请求上创建新的向量。 data.clear(); // fill it then
。