如何从webservice返回SQL查询结果

时间:2016-02-15 06:50:02

标签: java web-services

我想创建一个能够将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()时,程序就会卡住,而不会出现日志或控制台的错误。我的问题是让它工作(类型不限制),感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

我认为问题更多的是关于数据大小。 如果表格很大并且包含大量数据,那么根据用户请求返回它是没有意义的。

服务器上会消耗大量内存。如果许多用户同时请求数据(调用Web服务)会怎样?

此外,也许客户端会被如此大量的数据所淹没,并且会失去记忆。

数据库在这里也很努力,试图返回所有数据。

所以我认为你应该重新考虑使用如此大量数据的策略。 有很多有趣的技巧。

  1. 寻呼:

    您确定客户需要查看所有数据吗? 也许有意义的是暴露几个按钮(上一个/下一个),然后单击以仅使用一些分页参数调用Web服务

  2. 动态模型: 我可能错了,但是从表模型类的名称来看,不知何故我推断出你使用的是Swing(它并不重要,但它可以是web,SWT或者无论如何)。

    在这种情况下,当用户滚动数据时,您可能应该提供某种类型的侦听器来触发后台数据加载(Web中的Swing / AJAX中的线程)。

  3. 希望这有帮助