问题描述
我有兴趣将Anylogic 8.6中的模型链接到Redshift数据库中的表/视图。这样一来,该模型就可以自动提取新数据来定义我们的种群并运行,从而可以更好地进行运营决策(即,我们希望明天发生的事情,明天总是在变化)。
此版本具有与excel电子表格或sql Server数据库的本机连接。在FAQ中,是逐步链接到MysqL的指南。我已经对该指南进行了调整,以适应Redshift,但是对于如何使连接真正触发,或者如何测试它是否确实有效,我还不清楚。
这就是我所做的:
- 从https://docs.aws.amazon.com/redshift/latest/mgmt/configure-jdbc-connection.html 下载了最新的JDBC驱动程序。
- 我已将所有驱动程序文件提取到模型的文件夹中。
- 我已在AnyLogic中打开模型,选择“项目”视图,并在“依赖关系”选项卡上导入了驱动程序JAR文件(引用文件 RedshiftJDBC42-no-awssdk-1.2.50.1077.jar )
- 转到Main的'Advanced Java'属性,然后在Import部分中输入以下行:
import com.amazon.redshift.jdbc42.Driver;
。该模型可以正确编译/构建。
我不确定下一步该怎么做。
-
从“连接性”选项板中,将“数据库”拖到模型的“主要”部分。我已经
-
a)选择连接为“其他数据库类型”
-
b)在“ JDBC驱动程序”部分中,我输入了
com.amazon.redshift.jdbc42.Driver
我在以下内容中输入了连接URL中的 -
c):
jdbc:redshift://<Server>:<Port>/<Database>?ssl=true&tcpKeepAlive=true&sslfactory=org.postgresql.ssl.NonValidatingFactory
(这是来自workbench / dBeaver / KNIME的标准连接字符串,并与之一起使用,所有这些都是JDBC ) -
执行完此操作后,我仍然只看到导入表的常用选项。因此,我从“连接性”选项板中添加了一个“查询”项,并执行了一个简单的“从表中选择*”-但目前尚不清楚如何将其导入本地数据库...
下一步是什么?还是我在这里浪费时间? Redshift连接性将使我们的模型适合更广泛的运营用途还有很长的路要走...
非常感谢。
解决方法
将外部数据库(DB)表导入内置的AnyLogic DB是与通过Database对象和Connectivity面板元素读取/写入外部DB分开的事情。后者不会影响/更改前者。
您可以看到,后者可以对任何符合JDBC的DB进行(这就是FAQ指令所指的)。
仅Excel / Access和SQL Server支持前者。 (如果考虑到这一点,这要求将外部数据库的模式转换为内置的AnyLogic DB的模式,该模式实际上是标准的HSQLDB数据库;因此,按定义,即使使用使用JDBC,因此为什么仅支持某些外部DB。
因此,您可以从Redshift数据库中读取数据并写入内部AnyLogic DB中以进行“手动导入”(可以将其称为模型初始化的一部分);您还可以避免使用“连接性”选项板查询元素,而仅以标准Java方式执行SELECT查询,也许使用直观添加的Database对象可以更轻松地建立连接。
但是要记住,只有 可以使您能够使用内部数据库链接的内部可视化配置,例如代理填充和库块属性;您始终可以直接通过直接查询外部数据库来执行此操作(例如,这意味着需要更多“手动”代码来设置座席人口)。另外,您还具有有效地拥有两个数据库副本的存储开销,并且尚不清楚任何性能差异(是从一次性导入成本中获得的,还是在此之后可能对“本地” HSQLDB查询进行的任何改进)。
也可以使用它用于数据库导入的基础AnyLogic Java API(例如,importFromExternalDatabase
函数;搜索帮助)来使此操作稍微简单一些,但是您仍然需要预先准备好内部数据库表的设置(或编写代码来执行诸如解析外部数据库模式和创建适当的HSQLDB表之类的操作)。