You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java类间共享缓存资源 避免重复调用数据库的实现咨询

实现方案

你可以直接利用JVM静态内存做缓存,不需要依赖文件存储,完全符合你的三个需求,实现步骤如下:

步骤1:修复并完善DatabaseHelper的缓存逻辑

你现有代码里的databaseHelper已经定义了静态的resourceMap,只要调整实现保证线程安全、避免重复查询数据库即可:

import java.util.concurrent.ConcurrentHashMap;

public class DatabaseHelper {
    // 改用ConcurrentHashMap保证多线程并发访问安全,适配A、B测试同时运行的场景
    public static ConcurrentHashMap<String, List<Resource>> resourceMap = new ConcurrentHashMap<>();

    // 改成静态方法,并且加入判重逻辑避免重复调用数据库
    public static void getResourceFromDB(String resourceType) {
        // 已存在对应资源则直接返回,不重复查库
        if (resourceMap.containsKey(resourceType)) {
            return;
        }
        // 写入缓存,并发场景下也不会重复查询
        resourceMap.putIfAbsent(resourceType, callDatabase(resourceType));
    }

    // 新增对外获取资源的静态方法,供测试类直接调用
    public static List<Resource> getResource(String resourceType) {
        return resourceMap.get(resourceType);
    }

    // 原有查询数据库的方法保持不变
    private static List<Resource> callDatabase(String resourceType) {
        // 原有数据库查询逻辑
    }
}

步骤2:保持TestContainer的初始化逻辑不变

你现有testContainerA和testContainerB的initialize逻辑不需要调整,容器启动时调用DatabaseHelper.getResourceFromDB会一次性将对应资源加载到静态缓存中,全程只会查询1次对应类型的数据库资源:

public class TestContainerA extends SomeExternalClass {
    public void initialize() {
        // 一次性加载A类资源到缓存
        DatabaseHelper.getResourceFromDB("A");
        runTestContinuously(new RecurringTestA());
    }
}

public class TestContainerB extends SomeExternalClass {
    public void initialize() {
        // 一次性加载B类资源到缓存
        DatabaseHelper.getResourceFromDB("B");
        runTestContinuously(new RecurringTestB());
    }
}

步骤3:RecurringTest直接调用静态方法获取资源

测试类不需要改构造函数,直接调用DatabaseHelper的静态方法拿缓存资源即可,后续反复执行也不会再查数据库:

public class RecurringTestA {
    public void executeTest() {
        // 直接从内存缓存拿资源,无需查库
        List<Resource> resources = DatabaseHelper.getResource("A");
        // 原有负载测试逻辑
    }
}

public class RecurringTestB {
    public void executeTest() {
        // 直接从内存缓存拿资源,无需查库
        List<Resource> resources = DatabaseHelper.getResource("B");
        // 原有负载测试逻辑
    }
}

方案合规性说明

  • 满足recurringTest构造函数无参数要求:测试类仅通过静态方法获取资源,不需要传入任何参数
  • 无文件存储依赖:所有资源缓存在JVM静态内存中,只要容器进程不退出,缓存就会一直生效
  • 支持两个测试同时运行:使用ConcurrentHashMap保证并发读写安全,两类资源独立存储互不干扰

内容的提问来源于stack exchange,提问作者Shritama Sengupta

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:54:04