我正在开发一个允许用户上传图片的网络应用程序,然后系统将为他们生成拇指。
我的问题依赖于这样一个事实,即 EJB 可以分布在多个服务器上,因此不允许直接处理文件。我可以将图像存储在数据库中,但我希望将它们作为文件存储在其中一台服务器中。我怎样才能做到这一点?有没有办法集中存储文件?或者使用 EJB 处理 Java EE 中的文件的任何方法?
目前,我将文件存储在数据库中。所以我有集中访问,我不需要专用的文件服务器。我这样做是因为我不知道如何集成 ftp 服务器和 EJB。然而,这是一个很好的选择吗?
我想要的是:使用无状态 EJB,将上传的图像存储为文件,并将它们的路径存储在数据库中。所以我可以使用
<h:graphicImage ... />
最佳答案
你这里其实有四个方面,
由于您已经拥有 Java EE 服务器,因此您可能也已经拥有了一个 (HTTP) servlet 服务器,其中有许多方法可以进行负载平衡和 caching ,更不用说基于网络的交互的巨大潜力了。如果有的话,支持带有目录观察器的 FTP 传输作为奖励。
您不应该使用无状态 session bean 创建缩略图,这意味着您的服务器将在高峰时间出现问题 - 服务器将优先考虑业务逻辑而不是建立新连接。相反,首先接收文件+原始实体并将其存储在数据库中,然后使用服务 bean 将缩略图创建排队(如果需要,可以使用 n 个工作线程或消息队列)。在某些情况下,您还可以使用 native 工具,我们在 linux 中这样做。
您应该使用共享文件系统 SAN,它是在多台机器之间共享文件的正确工具。并根据文件系统的限制构建文件 - 例如每个目录的文件数和读/写容量。
一个数据库至少对于一个小型集群来说已经足够了,只要你没有用大的二进制 blob 杀死它。
如果有疑问,请购买更多内存 ;) 特别是缩略图非常可缓存,并且在 Tomcat 中也会提供良好的性能 - 如果您不熟悉多线程,请在 google 上查找缓存。还可以自然地缓存实体,而不仅仅是文件。
关于file - Java EE、EJB 文件处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5286974/