Java Web应用程序中并发访问文件的最佳解决方案

Java Web应用程序中并发访问文件的最佳解决方案,java,guava,Java,Guava,我正在编写一个webapp(SpringMVC+JSF),允许用户上传他们的文件并编辑/与其他人共享。在这个应用程序的服务层上,我使用guava处理所有文件IO,但不幸的是,从参考手册到目前为止我所看到的,guava没有解决并发访问文件的问题 我知道Java提供的FileChannel类有一个锁方法,在某种程度上解决了这个问题,但它不适合guava IO框架。在我摆脱guava并用FileChannel和InputStream重写代码之前,我想知道是否有其他方法可以做到这一点,而不必完全切换到另

我正在编写一个webapp(SpringMVC+JSF),允许用户上传他们的文件并编辑/与其他人共享。在这个应用程序的服务层上,我使用guava处理所有文件IO,但不幸的是,从参考手册到目前为止我所看到的,guava没有解决并发访问文件的问题

我知道Java提供的FileChannel类有一个锁方法,在某种程度上解决了这个问题,但它不适合guava IO框架。在我摆脱guava并用FileChannel和InputStream重写代码之前,我想知道是否有其他方法可以做到这一点,而不必完全切换到另一个IO包


(将文件名映射到锁的大型哈希表在我看来不是一个好的解决方案。当用户基数较大时,内存中存储的内容太多。)

使用数据库。文件系统非常适合存储实际的文件内容——但对于存储和管理用户、文件详细信息、共享以及编辑和版本历史等,数据库是绝对必要的

为了避免由于上传失败而丢失信息,上传和编辑(例如)需要转到一个新文件——而不是覆盖现有文件,或者将其丢弃

编辑和共享也可以假定为一个实体(可能是“文档”表中的一行),该实体可能有连续的版本(磁盘上的实际文件)

因此,至少出于两个原因,“文件系统文件”不同于您需要跟踪的实体&您的用户希望使用它

如果你假设的用户群真的越来越大,他们可能会期待一个真正的应用程序。有了可靠的数据库,记录用户访问、文档版本、共享以及磁盘上底层文件的位置和锁定状态变得简单可靠


如果没有这样的数据库,就不可能可靠地执行操作。

您是否可以对
文件
对象进行
同步
,而不是使用锁?@bmorris591将有大量文件,因此在任何IO函数调用结束时,对象将立即被销毁。也许创建一个带有文件名、集合读取器、集合编写器的数据库表是这种应用程序的最终解决方案,但我只会在没有其他简单解决方案的情况下这样做。@bmorris591除此之外,在其他人阅读时阻止读取器也不是一个好主意。将文件对象标记为“synchronized”会导致这种不良行为。您可以在打开
读卡器之前获取监视器。但是请使用文件系统存储实际的文件内容——FS在这方面效率更高。不要用水滴,谢谢。这是真的。如果有一些专门的数据库来存储文件内容并隐式处理同步问题,或者在这个领域有一个开源库,那就太好了。这肯定是有需求的。同步还不错——只要有一个DOCUMENT.storaged\u FILE列,或者一个DOC\u VERSION.storaged\u FILE列。一旦上传/新版本成功,只需使用新文件数据的(内部路径)更新或存储记录。数据库查询将只看到包含完整有效文件的结果。。还有什么比这更简单的呢?