Scrivere un’immagine alla risposta della servlet con le migliori prestazioni

Sto scrivendo un’immagine per la risposta servlet con le migliori prestazioni. Qualche consiglio, pratica, esperienza?

Per prestazioni e efficienza ottimali, non inserire l’intero contenuto in byte[] . Ogni byte mangia, sì, un byte dalla memoria di Java. Immagina 100 utenti simultanei che richiedono 10 immagini per ogni 100 KB, ovvero 100 MB di memoria Java consumati.

Ottenere l’immagine come InputStream dal DB utilizzando ResultSet#getBinaryStream() , avvolgerlo in un BufferedInputStream e scriverlo OutputStream della risposta racchiusa in un BufferedOutputStream attraverso un buffer di byte[] piccolo.

Supponendo che tu selezioni le immagini con la chiave del database come identificatore, usa questo nel tuo HTML:

  

Creare una class Servlet che è mappata in web.xml su un url-pattern di /images/* e implementare il suo metodo doGet() come segue .:

 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) {} } 

In ImageDAO#find() è ansible utilizzare ResultSet#getBinaryStream() per ottenere l’immagine come InputStream dal database.

è ansible utilizzare il byte del tipo di matrice per l’immagine dal servlet se è presente nel tipo Database of Blob.

 byte[] image; 

o c’è un altro modo, ma è un po ‘complesso. quando chiami il tuo servlet, quindi prima devi identificare se la chiamata è per immagine o è normale. se si tratta di una chiamata normale, allora si può andare avanti per chiamare servlet, ma se si tratta di una chiamata per l’immagine, allora non chiamare servlet, ma è ansible memorizzare i riferimenti dell’immagine in qualche posizione fisica nel computer e recuperare lo stesso.

Ma questo metodo non funziona se hai immagini in DB, piuttosto puoi avere percorsi relativi in ​​DB e poi puoi recuperare l’immagine da quel percorso.

Se le immagini sono statiche, tieni presente che la risposta più veloce è quella che viene gestita prima che arrivi a te.

Puoi alzare l’httpd di Apache davanti al tuo server Tomcat. È ansible utilizzare altre varianti dei server edge caching. Ci sono un sacco di trucchi lungo quelle linee.

Ovviamente, questo suppone che la tua applicazione sia scritta dove un URL si associa efficacemente a un’immagine in un modo facilmente memorizzabile nella cache. Se manca la tua applicazione, i benefici sono abbastanza grandi da considerare una ristrutturazione.