Votre question est très large, il est donc presque impossible d'y répondre.
Problèmes liés au tas
Tout d'abord, la raison de ce problème de tas pourrait tout aussi bien être que vous mettez en mémoire tampon l'ensemble du fichier téléchargé (c'est-à-dire que vous désérialisez l'image téléchargée en byte[]
ou autre). C'est quelque chose que vous ne devez jamais faire avec un contenu non fiable ou des limites de taille raisonnables, car quelqu'un pourrait télécharger un fichier de 16 Go et détruire complètement votre mémoire vive. Au lieu de cela, vous pouvez diffuser les octets téléchargés soit sur le disque, soit vers quelque chose d'autre qui fonctionne avec des flux.
FileUpload
de Apache Commons vous offre un moyen simple et agréable de prendre des téléchargements de taille arbitraire et de décider dynamiquement de les mettre en mémoire tampon ou sur disque en fonction de leur taille :
// Create a factory for disk-based file items
DiskFileItemFactory factory = new DiskFileItemFactory();
// Set factory constraints
factory.setSizeThreshold(yourMaxMemorySize);
factory.setRepository(yourTempDirectory);
// Create a new file upload handler
ServletFileUpload upload = new ServletFileUpload(factory);
// Set overall request size constraint
upload.setSizeMax(yourMaxRequestSize);
// Parse the request
List<FileItem> items = upload.parseRequest(request);
Séparer les applications
En ce qui concerne la séparation des candidatures, il suffit de faire 2 WAR, il n'y a pas de magie là-dedans. Mais gardez à l'esprit que tout ce qui fait planter votre application à cause de problèmes de tas est susceptible de faire planter toute la JVM Pour les isoler, il faut donc les répartir dans des JVM distinctes (c'est-à-dire des instances Tomcat distinctes).
Pour partager des classes communes, comme les contrôleurs, il suffit de les séparer dans un JAR dont dépendent les deux WAR. Un simple projet multi-module maven un module pour chaque WAR et un pour chaque JAR partagé.
Les ressources peuvent être partagées de plusieurs manières :
- Il faut également les regrouper dans un JAR partagé sous
META-INF/resources
: Cette fonction est prise en charge à partir de Servlet 3.0. Voici un guide détaillé . Cette approche a l'avantage d'être simple à déployer, il suffit de traiter le JAR de ressources comme n'importe quelle autre dépendance. L'inconvénient est qu'elle ne permet pas un redéploiement facile sans redémarrer l'application.
- Les déployer sur un lecteur partagé : Vous devez gérer un déploiement séparé, mais vous pouvez toujours redéployer sans affecter l'application.
JAR partagé avec des ressources statiques
S'il se trouve dans votre chemin de classe (c'est-à-dire à l'intérieur de WEB-INF/lib/
de votre WAR) vous avez un JAR qui contient META-INF/resources/image.jpg
vous pourrez y accéder via :
http://localhost:8080/<subcontext>/image.jpg
Véase le guide pour plus de détails.
Emplacement externe partagé
Vous pouvez demander à Tomcat de rechercher des ressources dans un emplacement externe. La configuration est différente selon la version de Tomcat :
<Context aliases="/images=/var/www/images" />
- La même configuration en utilisant la fonction
Resources
.
<Context>
<Resources>
<PostResources className="org.apache.catalina.webresources.DirResourceSet"
base="/var/www/images" webAppMount="/images" />
</Resources>
</Context>
Vous mettez ensuite les ressources statiques dans /var/www/images
(par exemple /var/www/images/image.jpg
) et d'y accéder par l'intermédiaire de http://localhost:8080/<subcontext>/images
(par exemple http://localhost:8080/<subcontext>/images/image.jpg
).
Véase ce tutoriel pour d'autres exemples.