我的应用程序中有两部分:管理和客户端部分。
在管理中,管理员上传文件并填写表格并制作其他管理工具。
在客户端,用户搜索从管理部分保存的实体。
我在与 tomcat服务器相同的项目中运行此项,但有时上传文件时出现Java Heap
问题且服务器停机,用户无法再进行搜索我重新启动服务器,我也不想通过上传文件来收取带宽。会话变量和超时之间存在冲突。
所以我想将它们分成两个独立的项目
答案 0 :(得分:2)
你的问题很广泛,所以几乎不可能回答。
首先,堆问题的原因可能是你在内存中缓冲整个上传的文件(即你将上传的图像反序列化为byte[]
或类似的东西)。这是您从未对不受信任的内容或合理的大小限制所做的事情,因为有人可能会上传16GB文件并完全破坏您的RAM。相反,您可以将上传的字节流式传输到磁盘或其他适用于流的内容。
FileUpload
from Apache Commons为您提供了一种简单明了的上传任意大小的方法,并根据大小动态决定是将它们缓冲在内存还是磁盘中:
// 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);
关于分离应用程序的主题,只需制作2个WAR,没有魔法。但请记住,由于堆问题导致应用程序崩溃,可能会导致整个JVM崩溃,因此为了隔离它们,您需要将它们部署到单独的JVM中< / strong>(即单独的Tomcat实例)。
要共享公共类,如控制器,只需将它们分成两个WAR所依赖的JAR即可。一个简单的maven multi-module project会做,每个WAR一个模块,每个共享JAR一个。
您可以通过以下几种方式分享的资源:
META-INF/resources
下的共享JAR中:从Servlet 3.0开始支持此功能。这是detailed guide。这种方法的优点是易于部署,只需将资源JAR视为任何其他依赖项。缺点是它不允许在不重新启动应用程序的情况下轻松重新部署。如果您的类路径(意味着WAR的WEB-INF/lib/
内)有一个包含META-INF/resources/image.jpg
的JAR,您将能够通过以下方式访问它:
http://localhost:8080/<subcontext>/image.jpg
有关详细信息,请参阅the guide。
您可以告诉Tomcat在外部位置查找资源。不同Tomcat版本的配置不同:
<Context aliases="/images=/var/www/images" />
Resources
。<Context> <Resources> <PostResources className="org.apache.catalina.webresources.DirResourceSet" base="/var/www/images" webAppMount="/images" /> </Resources> </Context>
然后,您将静态资源放入/var/www/images
(例如/var/www/images/image.jpg
)并通过http://localhost:8080/<subcontext>/images
访问它们(例如http://localhost:8080/<subcontext>/images/image.jpg
)。
有关更多示例,请参阅this tutorial。