以最佳性能将映像写入servlet响应

tab*_*lin 10 java performance servlets image

我正在以最佳性能将图像写入servlet响应.任何建议,做法,经验?

Bal*_*usC 23

为了获得最佳性能和效率,请不要将整个内容放入byte[].每个人byte都吃,就是来自Java内存的一个字节.想象一下,100个并发用户请求每100KB的10张图像,这已经消耗掉了100MB的Java内存.

InputStream从数据库中获取映像ResultSet#getBinaryStream(),将其包装并将其BufferedInputStream写入通过小缓冲区OutputStream包装的响应中.BufferedOutputStreambyte[]

假设您按数据库键选择图像作为标识符,请在HTML中使用:

<img src="images/123">
Run Code Online (Sandbox Code Playgroud)

创建Servlet其被映射在类web.xmlurl-pattern/images/*并执行其doGet()方法如下:

Long imageId = Long.valueOf(request.getPathInfo().substring(1)); // 123
Image image = imageDAO.find(imageId); // Get Image from DB.
// Image class is just a Javabean with the following properties:
// private String filename;
// private Long length;
// private InputStream content;

response.setHeader("Content-Type", getServletContext().getMimeType(image.getFilename()));
response.setHeader("Content-Length", String.valueOf(image.getLength()));
response.setHeader("Content-Disposition", "inline; filename=\"" + image.getFilename() + "\"");

BufferedInputStream input = null;
BufferedOutputStream output = null;

try {
    input = new BufferedInputStream(image.getContent());
    output = new BufferedOutputStream(response.getOutputStream());
    byte[] buffer = new byte[8192];
    for (int length = 0; (length = input.read(buffer)) > 0) {
        output.write(buffer, 0, length);
    }
} finally {
    if (output != null) try { output.close(); } catch (IOException logOrIgnore) {}
    if (input != null) try { input.close(); } catch (IOException logOrIgnore) {}
}
Run Code Online (Sandbox Code Playgroud)

ImageDAO#find()您可以使用从数据库中ResultSet#getBinaryStream()获取图像InputStream.