Anylogic中避免重复数据库查询的实例存储与映射方法咨询
Anylogic 预加载数据库数据到内存Map操作说明
原方案第二步的核心逻辑是:模型启动阶段一次性从数据库读取全量所需数据,转为自定义类实例后存在内存的Map结构中,后续查询直接走内存检索,完全避免运行时反复调用数据库的开销。
1 数据库行批量转自定义类实例的简便方法
Anylogic内置了数据库表到自定义类的自动映射能力,无需手动逐字段赋值,操作门槛很低:
- 先确认你创建的自定义类参数名、参数类型和数据库表的列名、列类型完全匹配(比如表有
origin/destination/transport_cost三个字段,自定义类也要有同名同类型的三个参数),假设自定义类名为RouteInfo - 在
Main组件的On startup(启动时执行)代码块中,调用Anylogic内置的selectFrom查询函数即可实现批量转换,示例代码:
// 自动将目标表的每一行映射为RouteInfo类的实例,存入List集合 List<RouteInfo> allDataList = selectFrom(你的数据库表名).list(RouteInfo.class);
只要类参数和表字段完全匹配,上述代码会自动完成所有行到类实例的转换,无需额外编码。
2 构建以Pair为键的映射Map
Pair是Anylogic提供的二元对象,可以同时存储两个值作为复合键,刚好适配Origin+Destination双字段唯一标识数据的场景:
- 首先在
Main组件的变量区新增一个Map变量:- 变量名:可自定义为
routeMap - 变量类型:填写
Map<Pair<String, String>, RouteInfo>(如果你的Origin/Destination是数值类型,把String替换为对应的Integer/Double即可) - 初始值:填写
new HashMap<>()
- 变量名:可自定义为
- 在刚才的批量转换代码后追加遍历写入逻辑,示例代码:
for (RouteInfo singleData : allDataList) { // 用Origin和Destination字段创建Pair复合键 Pair<String, String> dataKey = new Pair<>(singleData.getOrigin(), singleData.getDestination()); // 将类实例作为值存入Map routeMap.put(dataKey, singleData); }
后续查询使用示例
后续需要查询特定起终点的数据时,直接调用Map的get方法即可,不需要再访问数据库:
// 查询起点为"北京"、终点为"上海"的对应数据 RouteInfo target = routeMap.get(new Pair<>("北京", "上海")); // 直接取对应字段即可,比如获取运输成本:target.getTransport_cost()
注意事项
- 如果数据库中存在Origin+Destination重复的行,后存入Map的实例会覆盖先存入的,建议提前清理表中重复的起终点组合数据
- 该方案仅在模型启动时执行1次数据库查询,后续所有检索都是O(1)复杂度的内存操作,查询性能远高于重复数据库查询
内容的提问来源于stack exchange,提问作者mo_le28
相关产品推荐
相关产品推荐

