我的问题包括两个关于中断请求的部分:
我正在使用带有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,这取决于发送的数量,具体取决于发送的数量: 在更改之后,它看起来像以前一样:
显然我并没有错,谷歌似乎使用了同样的中断请求的方法(只是他们的服务器比我输入的更快):
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
我想知道是否有比我更好的方法来向数据库中搜索太多查询。谢谢