Guava Cache 的预加载值

2024-01-21

我有一个要求,我们从数据库加载静态数据以在 Java 应用程序中使用。任何缓存机制都应该具有以下功能:

  • 从数据库加载所有静态数据(一旦加载,这些数据就不会改变)
  • 从数据库加载新数据(启动时数据库中存在的数据不会改变,但可以添加新数据)

延迟加载所有数据不是一种选择,因为应用程序将部署到多个地理位置并且必须与单个数据库进行通信。当应用程序位于与数据库不同的区域时,延迟加载数据将使对特定元素的第一个请求太慢。

我一直在 Guava 中成功使用 MapMaker API,但我们现在正在升级到最新版本,我似乎无法在 CacheBuilder API 中找到相同的功能;我似乎无法找到一种在启动时加载所有数据的干净方法。

一种方法是从数据库加载所有密钥并通过缓存单独加载这些密钥。这可以工作,但会导致对数据库的 N+1 次调用,这并不是我正在寻找的有效解决方案。

public void loadData(){
    List<String> keys = getAllKeys();
    for(String s : keys)
        cache.get(s);
}

或者另一个解决方案是使用 ConcurrentHashMap 实现并自己处理所有线程和丢失的条目?我并不热衷于这样做,因为 MapMaker 和 CacheBuilder API 免费提供基于密钥的线程锁定,而无需提供额外的测试。我也非常确定 MapMaker/CacheBuilder 实现将具有一些我不知道/没有时间研究的效率。

public Element get(String key){
    Lock lock = getObjectLock(key);
    lock.lock();
    try{
        Element ret = map.get(key)
        if(ret == null){
            ret = getElement(key); // database call
            map.put(key, e);
        }
        return ret;
    }finally {
        lock.unlock();
    } 
}

谁能想到更好的解决方案来满足我的两个要求?


功能要求


在短期内我只会使用Cache.asMap().putAll(Map<K, V>).

Guava 11.0 发布后您可以使用Cache.getAll(Iterable<K>) http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/cache/Cache.html#getAll(java.lang.Iterable),这将为所有缺失的元素发出单个批量请求。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Guava Cache 的预加载值 的相关文章

  • 安卓。 onEditorAction 从未被调用

    我正在尝试捕捉从屏幕上移除键盘的事件 并且我正在使用OnEditorActionListener班级 然而 其onEditorAction方法永远不会被调用 这是我的 XML 格式的 EditText
  • 如何以编程方式检查应用程序是否在调试模式下运行?

    我必须在应用程序中的某个位置确定我的应用程序是在调试模式还是实时模式下运行 是否有任何函数或代码可用于检查 在开 关两种情况下都会返回 true false 如果是这样 请帮助我 提前致谢 从问题中尚不清楚调试模式是否指的是 应用程序是否可
  • 编译错误:Android Studio

    我正在尝试修改基于 IntelliJ 构建的现有 Android 项目 我已经搜索并尝试了很多东西 但我的错误仍然没有消失 Error 5 1 android apt compiler main D android tinynote app
  • 在 Java 中重置 Graphics2D 对象

    我正在用 Java 尝试 Graphics2D 但像往常一样 我被困住了 P 问题是 假设我有这个代码 Graphics2D g Graphics2D this getGraphics Inside a JFrame g rotate Ma
  • 修复 java 内存泄漏的学习网站

    学习修复 java 内存泄漏的最佳地点是什么 我一直试图在网络上找到好的资源 但令我失望的是 我发现正在讨论玩具示例 我还能够对小型玩具转储进行故障排除 但现实世界的应用程序转储更具挑战性 并且提供的线索很少 我尝试过 Jhat JMap
  • Android 上的 setTimeOut() 相当于什么?

    我需要等效的代码setTimeOut call function milliseconds 对于安卓 setTimeOut call function milliseconds 您可能想查看定时任务 http developer andro
  • 如何通过keytool命令删除已经导入的证书/别名?

    我正在尝试通过 keytool 命令删除已导入的证书 keytool delete noprompt alias initcert keystore keycloak jks 但低于异常 keytool 错误 java lang Excep
  • JTable AutoCreateRowSorter 将数字排序为字符串

    我有一个 JTable JTable table new JTable String colNames c1 DefaultTableModel model new DefaultTableModel Integer x new Integ
  • 仅使用 ServletContext 查找应用程序的 URL

    我正在使用 Spring MVC 编写一个 Java Web 应用程序 我有一个后台进程 它会遍历数据库并查找必须通过电子邮件发送给我的用户的通知 这些电子邮件需要包含应用程序的超链接 对于网络应用程序来说 这似乎是相当常见的模式 但我遇到
  • C# 中的 Culture 相当于 Java 中的 Locale 吗?

    C 使用文化的概念 这在操作上与 Java 中的 Locale 类似吗 或者底层概念是否存在显着差异 从文化而不是语言环境的角度进行工作是一种寻找正确抽象层次的尝试 从以类似方式做事的人群的角度来考虑事物 而不是谈论地理区域和语言 并有点疯
  • Spring Batch:比较数据库之间的数据

    我有两个数据库 Oracle 和 MySQL 目标是将Oracle表中的值保存到MySQL中 要求 MySQL表中不存在数据 但我在理解 Spring Batch 时遇到了困难 步骤中 它包含itemReader itemProcessor
  • 如何提高 Guice 启动时的性能

    好吧 我知道我的计算不客观等等 但无论如何 我讨厌在执行单元测试时等待这么多时间 我的 guice swing 应用程序需要大约 7 秒来初始化 这是一个简单的 IRC 客户端 在那一刻 没有打开连接 我什至还没有调用任何 java io
  • Java 中 LINQ 的等价物是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 中 LINQ 的等价物是什么 没有什么比 LINQ for Java 更好的了 Edit 现在
  • 在Java中一个接一个地播放WAV文件

    我正在尝试玩几个WAV http en wikipedia org wiki WAV文件一个接一个 我尝试了这个方法 for String file audioFiles new AePlayWave file start 但这会同时播放它
  • JFreeChart MeterPlot

    我目前正在用java做Agent项目 在某些时候 我需要显示一个仪表 例如 电池电量 我的程序中有 5 个代理 每个代理都会创建自己的带有名称的仪表图 但不知何故他们没有更新数据集 或者他们正在更新数据集 只是它没有显示在仪表图上 任何想法
  • Android:如何以编程方式仅圆化位图的顶角?

    我目前正在使用这段代码 Override public Bitmap transform Bitmap source Bitmap result Bitmap createBitmap source getWidth source getH
  • 何时以及为何使用缓冲输入和输出流? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我读到这些是为了减少磁盘 网络调用开销而使用的 这在写操作的情况下似乎很好 但是进行缓冲读取有什么好处呢 如果您按字节读取文件 则每次都会进
  • 仅在java中使用数组计算50的阶乘

    我是java的初学者 我有一个作业要编写一个完整的程序 使用数组计算 50 的阶乘 我无法使用像 biginteger 这样的任何方法 我只能使用数组 因为我的教授希望我们理解背后的逻辑 我猜 然而 他并没有真正教我们数组的细节 所以我在这
  • Spring Boot 健康执行器 - 什么时候上线?

    我找不到任何有关 Springs Health Actuator 何时返回 UP 状态的文档 你能依靠一切吗 Components正在初始化 会不会 Controller准备好满足请求了吗 为了测试应用程序上下文是否已加载 您可以执行此自定
  • 如何在 SpringDoc OpenAPI 3 中引用文件?

    我有 Spring Boot 项目 我想在其中记录我的 API 这里是正在处理的 Web 服务的示例 ApiResponses value ApiResponse responseCode 200 content Content media

随机推荐

  • JPQL 中的 LEFT JOIN ON()

    我有两个实体 User id long name String Player id long owner User 点 int 现在我想在一个 JPQL 查询中选择一个用户及其关联的玩家 在 SQL 中我会这样做 SELECT u p FR
  • 在使用 R 进行 PCA 分析之前省略 NA 和数据插补

    我正在尝试使用进行 PCA 分析princompR 中的函数 下面是示例代码 mydf lt data frame A c NA rnorm 10 4 5 B c NA rnorm 9 4 5 NA C c NA NA rnorm 8 4
  • Pyspark 根据另一个数据帧替换数组列上的值

    我有两个数据框 一个仅包含一些独特的数据框ids与相关的names像这样 Id name 0 name a 1 name b 2 name c 第二个数据帧包含存储在数组中的第一个数据帧的 id 每行 Row 1 row 2 0 0 2 1
  • Canvas绘制速度非常慢

    我想显示带有标记的比例尺 效果很好 最重要的是 我还想用红色指示器在刻度中显示鼠标位置 因此 我在运行应用程序时绘制画布 然后在更改鼠标位置时重新绘制整个画布 我是画布新手 不明白我的代码有什么问题 我一直在尝试解决它但没有运气 问题可能出
  • SwiftUI 可选环境对象

    我在用着 EnvironmentObject像这样 struct MyView View EnvironmentObject var object MyObject 但我的代码不需要有值object 仅将其设为可选是行不通的 甚至无法编译
  • 使用 RankNTypes 和 TypeFamilies 的非法多态或限定类型

    我一直在慢慢地致力于移植llvm https github com alphaHeavy llvm包使用数据类型 类型族和类型 nats 并在尝试删除用于对值进行分类的两种新类型时遇到了一个小问题 ConstValue and Value
  • 进程的开始时间

    如何使用 C 代码检索进程的启动时间 如果可能的话 我还想知道如何使用 Widows 内置的功能来做到这一点 public DateTime GetProcessStartTime string processName Process p
  • 在数据库表中存储整数或字符串之间的区别

    我关心性能 工程和可读性 假设我有一个博客 每个帖子都有其状态 已发布 4 待审核 2 草稿 1 建议将这些信息存储在什么位置status column status lt storing status as string pending
  • URI 模板可以用于将 URI 与路由匹配吗?

    ASP NET 或 Nancy 等框架提供了可用于指定路由的语法 例如 MapRoute customers id invoices invoiceId 在 ASP NET 中 路由有两个方向 他们能match请求 URI 例如 custo
  • Spring 的 AspectJ 模式缓存与 AspectJ 模式事务

    我的问题与 Spring 的 AspectJ 模式有关 特别是如何启用它 交易管理 Caching 1 我注意到 为了启用AspectJ模式进行事务管理 我只需要执行以下操作 Configuration EnableTransactionM
  • Spring JPA 存储库忽略 FetchType.LAZY

    我有我的实体类OneToMany定义的映射和通过扩展创建的 Spring JPA 存储库接口JpaRepository弹簧接口 我已将 fetch 设置为FetchType LAZY明确地在关联OneToMany注解 我面临的问题是 当我使
  • 如何在 IAuthenticationFilter 实现中设置 WWW-Authentication 标头?

    我正在使用 MVC5 的 IAuthenticationFilter 接口实现基本身份验证 我的理解是 这是现在的首选方法 而不是使用 DelegatingHandler 我已经让它工作了 但是 www authenticate 标头没有在
  • 在 collectionView Swift 中加载数据时显示活动指示器

    当我的 collectionView 中的数据加载时 我将如何显示活动指示器和白色背景 我目前有这个 let activityView UIActivityIndicatorView activityIndicatorStyle white
  • AndEngine游戏优化

    我在我的游戏中使用 java AndEngine 在游戏过程中我遇到了一些卡顿 我查找了信息并找到了一些如何优化游戏性能的步骤 避免GC 垃圾收集器 在游戏的主要动作中调用 a 游戏时不要创建物体 b 不要创建不必要的对象 优化重复次数较多
  • 为什么$a + ++$a == 2?

    如果我尝试这个 a 0 echo a a PHP EOL echo a 我得到这个输出 2 1 Demo http codepad org ncVuJtJu http codepad org ncVuJtJu 这是为什么 我希望得到这个作为
  • 如何停止(和重新启动)Rails 服务器?

    我正在按照此处的说明进行操作http railsinstaller org mac http railsinstaller org mac在运行 OS X 10 8 2 的 Mac 上启动并运行 Rails 在第 8 步 我被要求重新启动
  • 在带有 Weld 的 Spring Boot 环境中使用时,Omnifaces 2.x 失败

    最后 我在 Spring Boot 环境中成功引导了 Weld 如下所述here https stackoverflow com a 48140084 1907872 CDI 对于使用 Mojarra 的 JSF 和使用 Jersey 的
  • 如何通过.NET Core查找物理CPU核心数(不是逻辑SMT超线程)?

    我想检测实际物理核心的数量 而不是逻辑核心的数量 因为当更多线程竞争私有每核心缓存时 工作负载会出现负扩展 和 或具有足够高的 IPC 每个核心运行多个逻辑线程不会吞吐量的增加超过线程开销的增加 特别是对于无法完美扩展到大量内核的问题 或者
  • 如何获取“我的文档”的准确路径?

    在 C 中 获取 shell 在 Windows XP 和 Windows 7 中称为 我的文档 以及在 Vista 中称为 文档 的文件夹的完整路径名并不难 看获取我的文档的路径 https stackoverflow com quest
  • Guava Cache 的预加载值

    我有一个要求 我们从数据库加载静态数据以在 Java 应用程序中使用 任何缓存机制都应该具有以下功能 从数据库加载所有静态数据 一旦加载 这些数据就不会改变 从数据库加载新数据 启动时数据库中存在的数据不会改变 但可以添加新数据 延迟加载所