如何通过代码刷新AnyLogic的ModelDatabase内部数据库
AnyLogic运行时刷新内部ModelDatabase解决方案
问题根因
AnyLogic在模型启动时会将所有关联到内部ModelDatabase的参数、表函数、预查询结果缓存到内存中,你执行ModelDatabase.importFromExternalDB只是更新了底层数据库的存储数据,内存中的缓存没有同步更新,才会出现修改仅在重启模型后生效的现象,和auto-commit配置无关。
可用的刷新方案
- 刷新所有数据库关联的全局参数/代理属性:调用
getEngine().refreshDatabaseConnectedParameters(),该方法会触发全量重取所有绑定了数据库值的参数,同步内存和数据库的最新数据。 - 刷新自定义查询结果:如果你通过
selectFrom/sqlQuery等API自定义了查询逻辑并将结果存储到了变量中,需要在数据库导入完成后重新执行一次查询语句,覆盖原变量的旧缓存值即可。 - 刷新绑定数据库的表函数(Lookup Table):调用对应表函数实例的
reload()方法,例如你定义的表函数名为capacityLookup,执行capacityLookup.reload()即可完成刷新。
实验界面调用的适配代码
如果你的导入逻辑写在Simulation Experiment界面的组件动作中,不在仿真运行的代理上下文内,需要先获取当前运行的仿真实例再调用刷新方法,参考代码如下:
// 获取当前活跃的仿真运行实例 Simulation currentSim = getExperimentHost().getCurrentSimulation(); if (currentSim != null && currentSim.getEngine() != null) { // 刷新所有数据库绑定参数 currentSim.getEngine().refreshDatabaseConnectedParameters(); // 按需补充自定义查询重执行、表函数刷新逻辑 currentSim.demandLookup.reload(); }
内容的提问来源于stack exchange,提问作者Renier
相关产品推荐
相关产品推荐

