【问题标题】:Java EE, EJBs File handlingJava EE、EJB 文件处理
【发布时间】:2011-03-13 02:18:13
【问题描述】:

我正在开发一个允许用户上传图片的网络应用程序,然后系统会为他们生成拇指。

我的问题在于 EJB 可以分布在多个服务器上,因此不允许直接处理文件。我可以将图像存储在数据库中,但我希望将它们作为文件存储在其中一台服务器中。我怎样才能做到这一点?有没有办法集中存储文件?或者任何使用 EJB 在 Java EE 中处理文件的方法?


目前,我将文件存储在数据库中。所以我有集中访问,我不需要专用的文件服务器。我这样做是因为我不知道如何集成 ftp 服务器和 EJB。然而,这是一个不错的选择吗?

我想要的是:使用无状态 EJB,将上传的图像存储为文件,并将它们的路径存储在数据库中。所以我可以使用

显示它们
<h:graphicImage ... />

【问题讨论】:

  • 每年的上传容量/数量是多少?以及每次上传生成的缩略图数量?
  • @Thomas big numbers,这对我的解决方案有什么影响?
  • 首先根据文件系统的限制构建文件(目录) - 我们的 EXT3 已满。然后考虑维护和性能,如果您进行软启动,至少要计划 SAN。做数学,我猜,当然数据库中没有二进制图像..

标签: file jakarta-ee ejb storage


【解决方案1】:

你这里其实有四个方面,

  1. 接收和发送文件
  2. 创建缩略图
  3. 将文件存储在每个节点都可以访问的地方
  4. 将原始 + 缩略图实体存储在公共数据库中

既然您已经拥有 Java EE 服务器,那么您可能还已经拥有了一个 (HTTP) servlet 服务器,其中有许多方法可以进行负载平衡和caching,更不用说基于 Web 的交互的巨大潜力了。如果有的话,支持带有目录观察器的 FTP 传输作为奖励。

您不应该使用无状态会话 bean 创建缩略图,这意味着您的服务器将在高峰时间出现问题 - 服务器将优先考虑业务逻辑而不是建立新连接。相反,首先接收文件 + 原始实体并将其存储在数据库中,然后使用服务 bean 将缩略图创建排队(如果需要,可以使用 n 个工作线程或消息队列)。在某些情况下,您还可以使用原生工具,我们在 linux 中使用。

您应该使用共享文件系统 SAN,它是在多台机器之间共享文件的正确工具。并根据文件系统的限制构建文件 - 例如每个目录的文件数和读/写容量。

只要您不使用大二进制 blob 杀死它,单个数据库至少对于小型集群来说已经足够了。

如果有疑问,请购买更多内存 ;) 特别是缩略图非常可缓存,并且在 Tomcat 中也会提供良好的性能 - 如果您不熟悉多线程,请在 google 上查找缓存。还可以自然地缓存实体,而不仅仅是文件。

【讨论】:

  • 问题是我如何实际存储文件,因为禁止 EJB 访问文件或保留它们。我也不明白为什么将图像存储为文件和数据库实体。
  • JAVA EE 6 对带有 JPA 规范的 ORM 有很好的支持,但似乎我需要第三方库来分布式存储文件。我正在像 Shamit 建议的那样研究 WebDAV,但我认为应用服务器中应该包含如此重要的功能
  • 那么为什么你的 EJB 不能访问文件系统呢?就我们的 JBoss 而言,它并没有被禁止。将您的文件存储在文件系统中+在数据库中存储一个引用文件(路径、文件名等)的实体:P
  • EJBs 规范禁止访问文件系统,但我猜这在很大程度上取决于应用程序服务器。
  • 是的,只需将文件位置设置为可配置,您就可以了。如果有人要求您 100% 遵守规范,请查看例如 sourceforge.net/projects/filera,但我敢打赌它会在不同的包装上做同样的事情。
【解决方案2】:

您可能希望为此使用(私有)FTP 服务器。您的 EJB bean 可以联系此服务器以存储和检索文件。

Java 中有各种用于访问 FTP 服务器的库。特别适合在 EJB 环境中使用的是基于 JCA 的 FTP 连接器,但“普通”连接器通常也可以正常工作。

【讨论】:

  • 您能给我推荐任何基于 JCA 的 FTP 连接器吗?我对连接器不太了解。有这方面的教程吗?
【解决方案3】:

您也可以考虑使用clustered file system。 RedHat Global File System 和 Symantec 的 Veritas Clustered File System 是我使用过的两个。这些产品允许您跨多个服务器安装相同的文件系统以进行读/写访问。您的应用程序看到的只是另一个目录。如果您的环境已经拥有必要的组件(SAN 和优秀的系统管理员),那么这可能是许多用例中性能最佳的解决方案。

但是,这种方法也有缺点:

  1. 您将复杂性从应用转移到操作系统。设置这些产品并非易事。
  2. 如果您有一个大型服务器场,可伸缩性可能会成为一个问题。当出现扩展问题时,发现瓶颈并不像 arjan 的 ftp 解决方案那样简单。
  3. 您需要一个 SAN。

【讨论】:

    【解决方案4】:

    如果您可以对 EJB 实例的“位置”做出合理的假设,那么直接处理文件是没有问题的。在您的情况下(因为您想要文件)我会将图像读入本地临时文件夹并将其上传到远程目标。

    一种可能的方法是http://txconnect.sourceforge.net/ 处理(以及其他)ftp 连接的 JCA 事务适配器。在 xml 中配置工厂并将连接注入到您的 bean 中,您就可以开始了。

    根据您的应用程序服务器,可能有一个可用的特殊连接器(例如:Oracle 或 IBM 系统)

    【讨论】:

      【解决方案5】:

      我建议您坚持当前的解决方案。可以在您的 ejb 层之上构建 Ftp 访问(如果需要将文件保存在一起之外的其他目的)。显示存储在 DB 中的图像不是问题,简单的 servlet 就可以解决问题。

      【讨论】:

        【解决方案6】:

        你可以:

        1. 创建基于 WebDAV 的文件共享。这可以通过使用许多可用于 Java 或其他语言的库来完成。一个这样的库是:http://milton.ettrema.com/index.html
        2. 所有 EJB 实例都可以从此文件共享中读取/写入图像。他们需要使用 WebDav 客户端库
        3. 请设置此文件共享后目录的备份

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-08
          • 2013-08-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-15
          • 1970-01-01
          相关资源
          最近更新 更多