Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
File javaee,EJBs文件处理_File_Jakarta Ee_Ejb_Storage - Fatal编程技术网

File javaee,EJBs文件处理

File javaee,EJBs文件处理,file,jakarta-ee,ejb,storage,File,Jakarta Ee,Ejb,Storage,我正在开发一个web应用程序,允许用户上传图片,然后系统将为他们生成拇指 我的问题在于EJB可以分布在多个服务器上,因此不允许直接处理文件。我可以将图像存储在数据库中,但我希望将它们作为文件存储在其中一台服务器中。我该怎么做?有没有办法集中存储文件?或者用EJB处理JavaEE中的文件 目前,我正在数据库中存储我的文件。所以我可以集中访问,不需要专用的文件服务器。我这样做是因为我不知道如何集成ftp服务器和EJB。然而,这是一个好的选择吗 我想要的是:使用无状态EJB,将上传的图像存储为文件,

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

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


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

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

<h:graphicImage ... />

您可能需要为此使用(专用)FTP服务器。您的ejbbean可以联系此服务器来存储和检索文件


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

您还可以研究使用一个。赛门铁克的Veritas群集文件系统是我有经验的两个。这些产品允许您跨多个服务器装载相同的文件系统以进行读/写访问。应用程序看到的只是另一个目录。如果您的环境已经有了必要的组件(SAN和良好的系统管理),那么在许多用例中,这可能是性能最好的解决方案

然而,这种方法也有缺点:

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

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

    一种可能的方法是使用JCA事务适配器处理ftp连接。在xml中配置工厂,并将连接注入bean,就可以开始了


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

    我建议您坚持使用当前的解决方案。Ftp访问(如果不只是为了保存文件而需要)可以构建在ejb层之上。显示存储在DB中的图像不是问题,简单的servlet就可以做到这一点。

    您可以:

  • 创建基于WebDAV的文件共享。这可以通过使用许多可用于Java或其他语言的库来实现。其中一个图书馆是:
  • 所有EJB实例都可以从该文件共享读取/写入图像。他们需要使用WebDav客户端库
  • 是否在此文件共享后面设置目录备份

  • 这里实际上有四个方面

  • 接收和发送文件
  • 创建缩略图
  • 将文件存储在每个节点都可以访问的位置
  • 将原始+缩略图实体存储在公共数据库中
  • 既然您已经有了JavaEE服务器,那么您可能也已经有了一个(HTTP)servlet服务器,在这个服务器中有很多实现负载平衡的方法,更不用说基于web的交互的巨大潜力了。如果有的话,支持FTP传输与目录观察员作为奖励

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

    您应该使用共享文件系统SAN,它是跨多台计算机共享文件的合适工具。并根据文件系统的限制(如每个目录的文件数和读/写容量)来构造文件

    一个数据库至少可以容纳一个小集群,只要你不想用大的二进制blob杀死它


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

    您能给我推荐任何基于JCA的FTP连接器吗?我对连接器不太了解。有关于这方面的教程吗?每年上传的容量/数量是多少?以及每次上传生成的缩略图数量?@Thomas big numbers,这对我的解决方案有什么影响?首先,根据文件系统中的限制构造文件(目录)-我们的EXT3已满。然后再考虑维护和性能,如果您选择软启动,至少要为SAN制定计划。我猜,做数学,数据库中当然没有二进制图像。问题是我如何实际存储文件,因为EJB被禁止访问或持久保存文件。我也不明白为什么将图像存储为文件和数据库实体。JAVA EE 6非常支持带有JPA规范的ORM,但似乎我需要第三方库来分布式存储文件。我正在研究Shamit建议的WebDAV,但我认为应用服务器中应该包含如此重要的功能,那么为什么EJB不能访问文件系统呢?就我们的JBoss而言,这并不是禁止的。电阻