在 Anylogic 中避免数据库查询

Posted

技术标签:

【中文标题】在 Anylogic 中避免数据库查询【英文标题】:Avoiding database queries in Anylogic 【发布时间】:2021-11-22 13:19:30 【问题描述】:

我想避免在 Anylogic 中进行代价高昂的重复数据库查询。我在 Stack Overflow What is the fastest way to look up continuous data on Anylogic (Java, SQL) 中看到了以下线程,其中提供了一个简单的三步答案,但我不确定这三者中的第二点实际上是什么意思:

    在模型启动时将所有行作为该类的实例保存到地图中 - 您可以使用 Origin/Destination 作为键(使用 Anylogic 的 Pair 对象)并将类实例作为值

我创建了一个类,该类将数据库每一列的信息作为输入。我现在想将每一行保存为该类的一个实例 - 有没有一种简单的方法可以做到这一点?由于我是 Anylogic 的新手,所以我可能会遗漏一些简单的东西。

我也不确定如何创建映射,如果有人可以在上面的第 2 点添加更多细节,我将非常感激!

【问题讨论】:

【参考方案1】:

这实际上是最好的建议,您创建了类,这是一个很好的步骤,但是现在,该类的一个元素将用作键...例如名称...例如,如果您的类将 firstName 作为一个变量,lastName 作为另一个变量,您将使用一个字符串,该字符串是 firstName 和 lastName 的连接作为您的键。当然,任何键都可以,假设它对您的所有表都是唯一的。一个整数作为 id 也是可以的。

    创建一个 LinkedHashMap 类型的集合

    创建一个类(你做到了)

    您的集合将以字符串(名字+姓氏)作为键,并将类作为元素的值...

现在,当您读取数据库时,您将看到如下内容:

for(Tuple t : yourQueryResults)
    YourClass yc=new YourClass(t.get(db.var1),t.get(db.var2));
    String totalName=t.get(db.first_name)+"_"+t.get(db.last_name);
    yourCollection.put(totalName,yc);

现在每次你想找一个有名字的人,例如“John Doe”,而不是进行查询,你会这样做

yourCollection.get("John_Doe").theVarYouWant;

如果你使用 id 而不是 name,你可以设置一个 int 作为 key,然后你就可以yourCollection.get(theId).theVarYouWant

【讨论】:

感谢@Felipe 完美运行!

以上是关于在 Anylogic 中避免数据库查询的主要内容,如果未能解决你的问题,请参考以下文章

未能读取更新的 AnyLogic DB 值

anylogic时间折线图的模型开始时间可以为复数吗?

AnyLogic - 使用 Key-Value 数据库连接对象

Anylogic 7. 数据库建模

Anylogic:避免在占用块中不必要地执行进程

在这个查询中可以避免子查询吗?