【问题标题】:Caching images present in database缓存数据库中存在的图像
【发布时间】:2011-08-07 12:38:24
【问题描述】:

我将具有唯一 ID 的图像作为 BLOB 存储在数据库中,并通过从数据库中流式传输它们在 jsp 页面中显示它们。想知道是否有办法缓存图像,这样我就不必因数据库流式传输而产生延迟。如果有人提供一些 sn-p/example 以实现图像缓存,我会推荐。

【问题讨论】:

  • 您不能将它们与 DB blob 一起存储在文件中吗?这样您就可以查找名称/位置并从(希望)较少占用的磁盘访问它们。
  • 那将是mismtach的候选者。我想避免将图像放在两个地方,而是将它们放在数据库中,以便轻松移植它们。
  • 好吧,我是说您可以将它们存储在数据库中,也可以将它们存储在文件中。这将占用两倍的空间,但在您想要移植它们之前,您可以使用数据库作为备份,并将文件用于更快的检索。

标签: java image jsp caching


【解决方案1】:

你没有说你需要帮助的过程的哪一部分,但这是我会做的:

首先您必须创建一个类来保存缓存和元数据。我们称它为 ImageCache。当然,您需要一个字符串作为图像名称和一个 byte[] 来保存图像内容本身。然后在当前从数据库中提取图像的类中添加它们的集合。当图像请求进来时,在集合中搜索文件名。如果找到,只需将 byte[] 发回。如果它不在集合中,请从数据库中读取它,然后从中创建一个新的 ImageCache 对象并将其添加到集合中。

对于奖励积分,包括一个 Date lastAccessed 字段和一个 Comparator。比较器和日期字段将让您维护缓存。假设您的缓存可以容纳 50 张图像(基于可用内存)。您的 Comparator 可用于按 LRU (Least Recently Used) 顺序对 ImageCache 对象的集合进行排序,按 lastAccesed 升序排序。当集合达到最大条目时,找到 lastAccessed 最早的条目,并替换它。这将在不占用所有堆内存的情况下为您提供最佳的缓存命中率。

另一种选择是仅使用 Hibernate 作为程序和数据库之间的抽象层。这将提供许多好处,其中之一将是高度可配置和完全自动缓存。

【讨论】:

    【解决方案2】:

    只需在 Web 服务器前面拍一下 nginx(一个 http 缓存反向代理)。代码已经写好了,直接用吧。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-09
      • 1970-01-01
      • 1970-01-01
      • 2011-02-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多