J'utilise une servlet pour faire un multi fileupload (en utilisant apache commons fileupload). Une partie de mon code est affichée ci-dessous. Mon problème est que si je télécharge plusieurs fichiers à la fois, la consommation de mémoire du serveur de l'application saute plutôt drastiquement. C'est probablement OK si ce n'était que jusqu'à ce que le téléchargement du fichier soit terminé, mais le serveur de l'application semble rester en mémoire et ne le renvoie jamais au système d'exploitation. Je crains que lorsque je mettrai cela en production, je finirai par avoir une exception de mémoire insuffisante sur le serveur. Des idées sur pourquoi cela se passe-t-il? Je pense que le serveur a peut-être démarré une session et redonnera de la mémoire après son expiration, mais je ne suis pas 100% positif.Consommation de fichier de téléchargement de fichier de servlet
if (ServletFileUpload.isMultipartContent(request)) {
ServletFileUpload upload = new ServletFileUpload();
FileItemIterator iter = upload.getItemIterator(request);
while (iter.hasNext()) {
FileItemStream license = iter.next();
if (license.getFieldName().equals("upload_button") || license.getName().equals("")) {
continue;
}
// DataInputStream stream = new DataInputStream(license.openStream());
InputStream stream = license.openStream();
List<Integer> byteArray = new ArrayList<Integer>();
int tempByte;
do {
tempByte = stream.read();
byteArray.add(tempByte);
} while (tempByte != -1);
stream.close();
byteArray.remove(byteArray.size() - 1);
byte[] bytes = new byte[byteArray.size()];
int i = 0;
for (Integer tByte : byteArray) {
bytes[i++] = tByte.byteValue();
}
}
}
Merci d'avance!
J'ai mis à jour le code pour refléter les suggestions @skaffman et @ Bozho. Je crée maintenant l'objet ServletFileUpload en utilisant un DiskFileItemFactory, par lequel je passe des paramètres personnalisés à. Je gère également le InputStream de la bonne façon, en le fermant dans un bloc finally. Cependant, cela ne semble toujours pas avoir réglé le problème. Voici ce que je pense pourrait se produire. J'utilise une base de données derby, qui semble être ouverte dans le même thread que le serveur. Je stocke également les objets en tant que Blobs. Est-ce que la base de données elle-même est lue en mémoire et est maintenue? Merci pour tous les bons commentaires jusqu'à présent! Scott – Scott
Avez-vous réussi à trouver la solution? J'ai le même problème! –
Je n'ai pas vu autant de SO-ers célèbres dans une question :) – gkiko