我想创建一个能够将sql查询结果返回到3层架构中的客户端的服务。由于表的大小很大,我无法将结果值转换为String
(堆空间错误)。所以我尝试返回其他类型。我希望它可以返回Vector<Vector<Object>>
可以简单使用的DefaultTableModel
类型,如下所示的网络服务代码
public Vector<Vector<String>> ReturnSet()
{
try
{
DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
con = DriverManager.getConnection(url, user, password);
SQL = "Select * from table";
pst = con.prepareStatement(SQL);
Check = pst.executeQuery();
ResultSetMetaData metaData = Check.getMetaData();
int columnCount = metaData.getColumnCount();
Vector<Vector<String>> Vecs = new Vector<Vector<String>>();
Vector<String> cn = new Vector<String>();
for (int i = 0; i < columnCount; i++)
cn.add(metaData.getColumnName(i+1));
Vecs.add(cn);
while (Check.next())
{
Vector<String> Vec = new Vector<String>();
for (int i = 0; i < columnCount; i++)
Vec.add(Check.getString(i+1));
Vecs.add(Vec);
}
return Vecs;
}
catch(SQLException e)
{
return null;
}
}
在客户端,我使用Netbeans IDE创建了Web服务客户端。服务生成的代码如下,
private static java.util.List<usesql.Vector> returnSet() {
usesql.WS_Service service = new usesql.WS_Service();
usesql.WS port = service.getWSPort();
return port.returnSet();
}
但是每当我调用returnSet()
时,程序就会卡住,而不会出现日志或控制台的错误。我的问题是让它工作(类型不限制),感谢您的帮助。
答案 0 :(得分:2)
我认为问题更多的是关于数据大小。 如果表格很大并且包含大量数据,那么根据用户请求返回它是没有意义的。
服务器上会消耗大量内存。如果许多用户同时请求数据(调用Web服务)会怎样?
此外,也许客户端会被如此大量的数据所淹没,并且会失去记忆。
数据库在这里也很努力,试图返回所有数据。
所以我认为你应该重新考虑使用如此大量数据的策略。 有很多有趣的技巧。
寻呼:
您确定客户需要查看所有数据吗? 也许有意义的是暴露几个按钮(上一个/下一个),然后单击以仅使用一些分页参数调用Web服务
动态模型: 我可能错了,但是从表模型类的名称来看,不知何故我推断出你使用的是Swing(它并不重要,但它可以是web,SWT或者无论如何)。
在这种情况下,当用户滚动数据时,您可能应该提供某种类型的侦听器来触发后台数据加载(Web中的Swing / AJAX中的线程)。
希望这有帮助