中止Ajax和JDBC请求

时间:2016-12-13 14:34:52

标签: java jquery sql-server ajax database-performance

我的问题包括两个关于中断请求的部分:

我正在使用带有SQL Server 2008和JavaScript / jQuery(3.1.1)的动态Java Web应用程序(Tomcat 8.0.15,Java EE 7 Web)。

显然,几年前Stackoverflow上已经发布了该问题的一些变体。

我有一个带有onkeyup事件的输入/ textarea字段,该事件向Servlet发送请求并获得某种类似谷歌的建议 - 下拉的响应。

每当我触发另一个jQuery-Ajax-Request时,我就会想到旧的on。昨天我意识到情况并非如此(更多?)我得到了几次下拉而不是一次。 如果您碰巧知道jQuery是否在新版本中更改了某些内容,请告诉我如何以及是否能够将其恢复。

第二部分是在服务器端:我正在向数据库发出一个非常繁重的查询,并希望在Ajax-Request中止时中断该查询。这似乎是一个很大的问题。 这里已经讨论过PHP / MySQL(Stop mysql query when press stop button)中的相同问题。 回到2009年,“没有简单的方法”:How to cancel ajax request that has run (on server side) - 我想知道是否有变化,同时我可以做些什么。

有关Ajax查询如何被中断的方法有多种。我选择Abort Ajax requests using jQuery,我的代码如下:

主要-文件:

   <html>
        <head>
            <script>
            var xhr; //global variable for the Ajax-Object
            </script>
            <meta ... />

这个领域也很简单:

<textarea id="field_106" onkeyup="sendInfo(/*Some parameters*/)"></textarea>

代码:

function sendInfo(/*All the Params*/) {

//That's new
        if(xhr!=null){
            xhr.abort();
        }
//Before I haven't had that xhr-val too
        xhr=$.ajax({
            url: jsp,
            data: {
                input: document.getElementById(input).value,
                /*
                * Lots
                * of
                * other
                * parameters
                */
            },
            type: 'GET',
            success: function (result) {
                document.getElementById(output).innerHTML = result;
            },
            error: function (XMLHttpRequest, textStatus, errorThrown) {
                document.getElementById(output).innerHTML = "err--" + XMLHttpRequest.status + " -- " + XMLHttpRequest.statusText;
            }
        });

    }
}

在使用Firebug-Console之前我遇到的问题是每个keyup-event都会触发自己的Request,这取决于发送的数量,具体取决于发送的数量: Old style of AJAX 在更改之后,它看起来像以前一样: Like it should look

显然我并没有错,谷歌似乎使用了同样的中断请求的方法(只是他们的服务器比我输入的更快): Google-Results

Servlet将两个查询放在一起。前四个条目是“最佳结果”,取决于使用情况,第二个条目取其余部分:

 private final String sql = "SELECT TOP 5 "
            // ALL THE VALS
              " FROM TopResults "
            + " WHERE Description like ? order by CNT desc";

    private final String sql2 = "SELECT  "
            // SAME VALS
            + "FROM Articles art "
            + "LEFT OUTER JOIN "
            + "TopResults ON ArtikelNr=Artikelnumber "
            + "WHERE art.Artikelbezeichnung1 like ? "
            + ""
            + "EXCEPT "
            + ""
            + sql;


    public String getInfo() {
        Connection c = null;
        PreparedStatement ps = null;
        ResultSet rs = null;
        StringBuilder ret = new StringBuilder();

        try {
            c = BaseConnection.getConnection();

            ret.append(getTableStart());

            ps = c.prepareStatement(sql);
            ps.setString(1, "%" + query + "%");
            rs = ps.executeQuery();

            ret.append(appendX("", rs));

            BaseConnection.disconnect(rs, ps);

            ps = c.prepareStatement(sql2);
            ps.setString(1, "%" + query + "%");
            ps.setString(2, "%" + query + "%");
            rs = ps.executeQuery();

            ret.append(appendX("topTR", rs));

            ret.append(getTableEnd());

            return ret.toString();
        } catch (SQLException | NamingException ex) {
            Logger.getLogger(GetInfo.class.getName()).log(Level.SEVERE, null, ex);
            return ex.getLocalizedMessage() + "<br/>" + ((ex instanceof SQLException) ? ((SQLException) ex).getSQLState() : "Naming Exception");

        } finally {
            BaseConnection.disconnect(rs, ps, c);
        }

    }

在这里,我想知道我发送两种语句的风格,但它只是一种风格:Executing two Java PreparedStatements with one connection - style choice

我想知道是否有比我更好的方法来向数据库中搜索太多查询。谢谢

0 个答案:

没有答案