Servlet长数据缓存过程

时间:2016-02-25 01:44:03

标签: tomcat servlets

我正在寻找设计最佳实践来实现以下应用程序。 平台:RedHat Linux,Tomcat 8,Java 8.最终将移动到JBOSS应用服务器。

启动时我的servlet将从10个大文件中读取并构建一个用于回答用户查询的数据结构。需要约。在数据结构准备好之前,每个文件加载2分钟,总共20分钟。

目前,我在ServletContextListener中使用了此代码,并使用setAttribute()方法放置数据结构,以使其可用于Servlet。

问题:当我上传war文件时,servlet在加载文件集之前不可用 - 20分钟。我不介意这一点,但我想知道是否有更好的方法来实现这一点。

1 个答案:

答案 0 :(得分:0)

我同意阅读时间不是你的问题:阅读10 * 30M = 300M应该可以在<1分钟内完成。您的问题是构建数据结构所花费的时间。

我建议你......

  1. 简化内存中的数据结构
  2. 优化文件格式以便快速加载
  3. 在阅读文件时避免垃圾收集
  4. 以并行线程加载文件
  5. 在(1)中,使您的数据结构保持较少的较大对象。例如,使用byte [4000]代替具有(int)成员的1000个对象。然后,对于每个客户端请求,您可以从byte [4000]数组中选择数据。这将节省 lot 的时间,因为分配大量小的长寿命对象很慢。我希望这将是你的主要胜利。

    在(2)中,使文件以(1)中的字节[4000]数组等对应的块存储数据。然后,您可以使用单个读取(arByte)调用加载数据块。 (如果你想要更高的速度,你可以将内存映射到你的文件,但我不推荐这样做,因为代码中有额外的复杂性。)

    在(3)中,避免在读取文件时制作大量临时对象。每个临时对象都必须进行垃圾回收。对于像服务器这样的高内存使用程序,垃圾收集可能需要很长时间。配置您的服务器以查看GC-s是否正在减慢速度。如果它们(例如)重用一个StringBuilder对象来处理每个记录,而不是为每个记录分配一个新的String对象。

    我强烈推荐(1)。你的服务器加载速度会更快,而且矛盾的是它也可能运行得更快,因为它可以节省大量内存。