【问题标题】:Java solution for database-backed cache数据库支持缓存的 Java 解决方案
【发布时间】:2016-11-23 00:17:56
【问题描述】:

我已经搜索了一种使用数据库作为存储的缓存解决方案,但只提出了查询缓存。是否有任何解决方案可以实际使用数据库作为缓存数据的存储机制?

为了给出一些观点,我的问题如下:我正在使用一个 Web 服务资源,这可能比查询我的数据库更耗时。因此,我想在我的数据库中缓存我的 Web 服务请求的结果。

我意识到我可以手动完成此操作,但我虽然必须有一些现有的解决方案,我至少可以调查它是否对我的目的有用。

更多信息:我当前的项目库由 Java EE 7 和 Hibernate 组成。

我希望 EHCache 能帮到我,但它似乎只提供内存或基于文件的解决方案。此特定缓存的内存占用量太大。此外,这将在集群环境中运行,因此基于文件的解决方案会导致同步问题。

【问题讨论】:

标签: java database caching


【解决方案1】:

RedHat 的 Infinispan 有几个不同的基于 JDBC 的存储实现,可以满足您的要求。看看:http://infinispan.org/docs/stable/user_guide/user_guide.html#jdbc_based_cache_loaders(免责声明:我没有使用它的经验,所以我不能说它运行有多稳定或设置有多复杂)。

通常使用数据库进行缓存持久性具有 Pro 和 Con 参数。 Pro 的论点是,您可能更容易部署和资源管理,因为数据库已经到位。

Con 的论点是,使用数据库意味着对系统的额外压力。对于缓存更新,您将有很多数据库事务迫使您的磁盘同步并且您的 CPU 等待 IO 完成。对于缓存,您不需要这种行为,因为数据存储本质上是临时的。

【讨论】:

    【解决方案2】:

    对于这类问题,我通常建议使用基于队列的解决方案。这些解决方案允许您将客户端(您的应用程序)和服务器(Web 服务端点)解耦,这样您就可以执行这种非阻塞模式:

    • 不要阻止客户端
    • 收到的数据到达时执行操作
    • 如果需要,可以将接收到的数据保存到数据库中

    我建议你使用 ActiveMQ 来实现队列功能和 Apache Camel 来管理服务调用/转换/持久性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-05
      • 2013-12-13
      • 1970-01-01
      相关资源
      最近更新 更多