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
相关产品推荐
相关产品推荐

