7

所以我有这个要求,说应用程序必须让用户每月上传和下载大约 6000 个文件(主要是 pdf、doc、xls)。

我在考虑这个的最佳解决方案。问题是我是否会在我的数据库中使用 BLOb 或使用简单的文件层次结构来写入/读取这些文件。

应用架构基于 Java 1.6、Spring 3.1 和 DOJO、Informix 10.X。

所以我来这里只是为了根据你的经验得到建议。

4

2 回答 2

9

当询问什么是“最佳”解决方案时,最好包括您的评估标准——速度、成本、简单性、维护等。

Mikko Maunu 给出的答案几乎是钱。我已经 20 年没有使用过 Informix 了,但是大多数数据库在处理 BLOB 时有点慢——尤其是让 BLOB 进出数据库的步骤可能很慢。

随着越来越多的用户同时访问系统,这个问题往往会变得更糟,特别是如果他们使用 Web 应用程序 - 应用程序服务器必须非常努力地将文件进出数据库,可能为这些请求消耗更多的内存比正常,完成与文件相关的请求可能比“正常”页面花费更长的时间。

这可能会导致网络服务器在中等负载下变慢。如果您选择将文档存储在数据库中,我强烈建议您运行一些性能测试以查看您是否有问题 - 这种解决方案往往会暴露您的设置中的缺陷,否则这些缺陷不会暴露出来(网络速度慢与数据库服务器的连接、Web 服务器中的 RAM 不足等)

为避免这种情况,我已将文档的“主”副本存储在数据库中,以便将它们全部备份在一起,并且我可以向数据库询问诸如“我有用户 x 的所有文档吗?”之类的问题。但是,我在网络服务器上使用了缓存来避免从数据库中读取超出我需要的文档。如果您有像内容管理系统这样的“一次写入,多次读取”的时间解决方案,则此方法非常有效,缓存可以在其中获得保留。

于 2012-07-12T08:02:08.580 回答
6

如果您在数据库中有与这些文件相关的其他数据,则将文件存储到文件系统会使其更加复杂:

  1. 备份应单独进行。
  2. 事务必须单独实现(尽可能用于文件系统操作)。
  3. 数据库和文件系统结构之间的完整性检查并不是开箱即用的。
  4. 无级联:删除用户后删除用户图片。
  5. 首先,您必须从数据库中查询文件的路径,然后从文件系统中选择一个。

基于文件系统的解决方案的好处在于,有时能够直接访问文件很方便,例如将部分图像复制到其他地方。当然,存储二进制数据也可以极大地改变数据库的大小。但无论如何,这两种解决方案都需要更多的磁盘存储空间。

当然,所有这些都可能需要比当前可用的更多的数据库资源。通常会严重影响性能,尤其是在本地文件系统和远程数据库之间进行决策时。在您的情况下(每月 6000 个文件)原始性能不会有问题,但延迟可能会。

于 2012-07-12T07:25:14.243 回答