用Java缓存大文件

时间:2014-12-16 19:12:11

标签: java caching

我有一个大的二进制文件(300KB),我将其作为中等blob存储在数据库表中。文件内容每天更改一次。有多个客户端请求文件中的各种字节范围。我没有为每个请求进行数据库调用,而是希望将整个文件缓存一天。我们有一个分布式系统。我们使用Tomcat,MySQL和Java语言。缓存文件的最佳方法是什么?

3 个答案:

答案 0 :(得分:0)

似乎像一个Web应用程序。如果是这种情况,您可以将数据存储为ServletContext中的属性。然后,每次收到请求时,都要读取此属性,而不是每次都访问数据库。此外,您可以建立一个任务,以便在给定时间或按需自动更新此属性。

如果您的应用程序不是Web应用程序,或者您需要/需要更通用的解决方案,请使用支持跨JVM缓存的EhCache或Infinispan等缓存库。您也可以考虑使用Hazelcast。

答案 1 :(得分:0)

您可以将Squid之类的HTTP代理放在应用程序服务器前面,也可以放在Web服务器前面(如果有的话)。 Squid可以配置为缓存响应的内容。可以使用HTTP标头字段控制缓存策略。这是一个很好的解决方案,不需要开发,适用于大型文件,因为访问缓存文档时不涉及应用程序服务器。 另一个解决方案是使用ehcache(或另一个缓存,但ehcache是​​我经验丰富的)。您可以将其配置为在您为此目的实现的服务返回文档时缓存该文档。 在您的上下文中,增益低于HTTP代理,因为访问高速缓存文档时涉及应用程序服务器。但数据库不是。当访问资源需要长时间处理时,此解决方案带来更大的收益。 请注意,ehcache很容易与Spring-cache集成。

答案 2 :(得分:-1)

我会在这里创建一个单身:http://www.oodesign.com/singleton-pattern.html

单身人士将存储此二进制文件并在客户请求时刷新它,并且引用超过1天。

这是伪代码。

class SingletonBlob{

private static Binary myFile;
private static Date lastUpdate;

public static getMyFile(){
 if(myFile == null or lastUpdate > 1 day){
   myFile = fetchFromMysql();
 }
 return myFile;
}