gpt4 book ai didi

java - 处理 servlet 中的意外结束请求

转载 作者:行者123 更新时间:2023-11-30 09:55:05 24 4
gpt4 key购买 nike

我目前正在使用 Jersey/Tomcat 开发 REST Web 服务(但欢迎使用通用的 Servlet/Container 答案)。如果客户端从 MySQL 连接对返回大量数据的服务执行一些 GET 请求。

为了避免任何 OOM 异常,我为 MySQL 使用流模式。

但是,如果客户端在加载过程中中止请求,则MySQL连接不会关闭。之后,服务器将不会处理任何其他请求,因为一次只能有一个“流”请求。

所以问题是:当请求在我的服务器上结束时(正常或异常)如何通知我?我可以注册某种监听器吗?或者使用 UncaughtExceptionHandler ?

我已经看到很多关于在 Jersey 中处理异常以将它们转换为“响应”的事情,但没有看到任何关于处理请求过早结束的事情。我想 Jersey 或 Tomcat 可能会在没有通知的情况下简单地破坏我的线程。我能否在我的方法的关键部分捕获一些异常以了解何时发生此类线程中断?

预先感谢您的帮助,

拉斐尔

最佳答案

通常,当在 response.getOutputStream 上调用 flush()close() 时,将抛出 IOException () 而另一端已中止连接。

通常,关闭数据库连接(和其他资源)应该发生在 try block 的 finally block 中打开它的地方,这样它就会被关闭无论如何,以防万一。

总结一下,这个例子应该做的:

String search = getItSomehow();
Connection connection = null;
PreparedStatement statement = null;
ResultSet resultSet = null;

try {
connection = database.getConnection();
statement = connection.prepareStatement(SQL_FIND);
statement.setString(1, search);
resultSet = statement.executeQuery();

if (resultSet.next()) {
response.setContentType(resultSet.getString("contentType"));
response.setContentLength(resultSet.getInt("contentLength")); // Optional.
BufferedInputStream input = null;
BufferedOutputStream output = null;
try {
input = new BufferedInputStream(resultSet.getBinaryStream("content"));
output = new BufferedOutputStream(response.getOutputStream());
byte[] buffer = new byte[1024];
for (int length; (length = input.read(buffer)) > 0;) {
output.write(buffer, 0, length);
output.flush();
}
} finally {
if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
} else {
response.sendError(HttpServletResponse.SC_NOT_FOUND);
}
} catch (SQLException e) {
throw new ServletException("Something failed at SQL/DB level.", e);
} finally {
if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}

关于java - 处理 servlet 中的意外结束请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3006286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com