数据库端口可以使用ODBC和ADO.NET(Windows)或JDBC (Java)驱动程序从各种数据库中存储和检索数据。
概览
数据库端口连接到许多不同的数据库提供程序之一。每个数据库端口实例都配置有适合目标数据库的驱动程序。开源数据库的驱动程序可以免费安装和使用:
- MySQL
- PostgreSQL
- SQLite
其他数据库需要额外的许可证才能安装和使用驱动程序:
- SQL Server
- Oracle
- Access
- DB2
- FileMaker Pro
建立到目标数据库的连接后,端口读取数据库中存在的表/视图列表。通过选择一个可用的表并从该表中选择列来创建输入或输出映射。端口使用选定的表和列生成一个XML架构结构。
生成输入映射后,当端口接收到与输入映射的XML结构匹配的XML文件时,它将自动将数据插入数据库。生成输出映射后,端口将从数据库中提取数据,并使用提取的值填充与输出映射具有相同的XML结构的XML文件。
端口配置
本节包含所有可配置的端口属性。
配置
驱动配置
与数据库驱动程序相关的配置。
连接类型 | 用于与数据源通信的数据库驱动程序的类型。Windows版支持ODBC和ADO.NET驱动程序,而Java版支持JDBC驱动程序。 |
数据库连接
与建立数据库连接相关的配置。这些字段是根据所使用的数据库类型动态生成的。
驱动名称(ADO.NET) | 要连接的数据库类型。 |
数据源名称(ODBC, JDBC) | 要连接的数据库类型。 |
连接字符串 | 字符串格式的数据库凭据。仅适用于ADO.NET连接,并用于替代其他连接字段。 |
服务器 | 托管数据库的服务器的主机名或IP地址。仅适用于某些驱动程序类型。 |
端口 | 要连接到数据库主机的端口。仅适用于某些驱动程序类型。 |
数据库 | 要连接到的数据库的名称。仅适用于某些驱动程序类型。 |
用户名 | 有权访问数据库的用户凭据。 |
密码 | 与指定用户关联的密码凭据。 |
映射关系
在数据库表和XML文档结构之间建立映射关系。一旦创建了这些映射,就可以将XML数据插入到数据库中,并且可以将从数据库中检索到的数据作为XML推出。
输入映射 | 输入映射在XML文档结构和数据库插入(或更新)之间创建关系。当匹配输入映射结构的XML文件到达数据库端口时,端口使用输入文件中的值对数据库进行插入/更新调用。有关生成输入映射的更多信息,请参见输入映射部分。 |
输出映射 | 输出映射在XML文档结构和数据库选择语句之间创建一种关系。当端口从数据库接收数据时,它用与输出映射相同的XML结构填充一个XML文件。然后,该XML文件被推送到RSSBus Connect 工作流中的下一个端口。有关生成输出映射的更多信息,请参见输出映射部分。 |
自动
自动化配置
与端口自动处理文件相关的设置。
发送 | 匹配输入映射的XML文件是否会自动插入数据库。 |
重试间隔 | 重试失败的插入/更新之前的时间。 |
重试最大尝试次数 | 端口引发错误之前重试失败的插入/更新的最大次数。 |
接收 | 是否应该自动从目标数据库中提取数据并用于生成与配置的输出映射匹配的XML文件。 |
接收执行间隔 | 自动尝试从数据库中检索数据的间隔时间。 |
分钟 | 下载前等待的分钟数。仅在接收执行间隔设置为分钟时适用。 |
整点过几分 | 每小时计划的分钟偏移量。仅在接收执行间隔设置为每小时时适用。例如,如果该值设置为5,自动化服务将在1:05、2:05、3:05等处启动。 |
时间 | 给定日期内下载发生的时间。仅当接收执行间隔设置为每日、每周或每月时适用。 |
天 | 拉取请求应该发生的日期。仅在接收执行间隔设置为每周或每月时适用。 |
cron表达式 | 表示cron表达式的任意字符串,用于确定拉请求应该何时发生。仅在接收执行间隔设置为高级时适用。 |
高级
高级设置
可用的高级设置列表取决于所选的特定数据库类型。有关更多信息,请参见特定数据库的文档(例如,如果在数据库端口中使用MySQL驱动程序,请参见MySQL端口)。所有数据库的可用设置如下。
本地文件夹
确定磁盘上发送/上传文件的文件夹以及接收/下载文件的文件夹的设置。
输入文件夹(Send) | 端口可以发送/上传放在此文件夹中的文件。如果启用了自动发送,端口将自动轮询处理此文件夹中的文件。 |
输出文件夹(Receive) | 端口会将接收/下载的文件放在此文件夹中。如果端口连接到工作流中的另一个端口,文件将不会保留在这里,而是传递到已连接端口的输入/Send文件夹。 |
已处理文件夹(Sent) | 处理文件后,如果启用了保存到已发送文件夹,端口将在此文件夹中放置已发送/已上传文件的副本。 |
执行
与端口资源分配相关的设置。
最大线程数 | 线程池中用于处理此端口上文件的最大工作线程数。如果设置,将覆盖配置文件选项卡中的默认设置。 |
最大文件数 | 每次将工作线程分配给端口时,端口将处理的最大文件数。如果设置,将覆盖配置文件选项卡中的默认设置。 |
建立连接
与数据库端口建立连接需要适当的数据库驱动程序和特定于数据库的连接属性。端口用户界面将根据目标数据库动态更新预期的连接属性。
填写连接属性后,点击测试连接按钮验证端口是否可以与目标数据库通信。
ODBC
数据源名称(DSN)需要通过远程数据库驱动程序连接到数据库,并且可以通过微软远程数据库管理员创建。RSSBus Connect必须为ODBC驱动程序使用系统DSN连接。在系统中创建DSN后,从数据源名称端口下拉列表中选择适当的DSN。
ADO.NET
为了使ADO.NET提供程序对RSSBus Connect可见,它必须在machine.config文件中定义并在全局程序集缓存(GAC)中注册。这可以由知识丰富的用户手动完成,但建议在安装RSSBus Connect的计算机上安装数据库客户端,因为特定于数据库的安装向导将处理定义和注册提供程序。
JDBC
为了让JDBC驱动程序对RSSBus Connect可见,它必须包含在Java类路径中。RSSBus Connect包括MySQL、PostgreSQL和Derby的驱动程序;请参考Java web servlet的文档,向classpath添加不同的驱动程序。
输入映射
输入映射表示对目标数据库中一个或多个表的插入/更新。它们是通过可视化映射编辑器面板创建的,然后在内部建模为XML。端口处理的与输入映射的XML结构匹配的文件将自动转换为插入或更新查询。
将XML转换为数据库查询的过程在输入映射为XML部分中有详细说明;从概念上讲,端口只是简单地从XML元素中读取值,并在进行INSERT/UPDATE语句时使用它们。
创建输入映射
单击“添加映射”按钮(+)创建新映射。从数据库中的可用表列表中选择目标表/视图,以调出映射编辑器面板。在映射编辑器中,选择应该包含在INSERT/UPDATE中的表列。对于简单的INSERT,这就是生成映射所需的全部。
创建输入映射后,可以通过单击映射名称旁边的“Code”按钮(</>)来查看其XML表示。
UPSERT
UPSERT设置控制端口如何决定是插入还是更新。最常见的情况是将UPSERT设置为:表的主键。使用这种配置,端口将从输入的XML中读取主键值,查询数据库以查看该键是否已经存在于表中,如果存在则更新记录,如果不存在则插入新记录。UPSERT by:可以设置为主键以外的列,但这可能会导致从数据库返回多个记录。在这种情况下,端口更新返回的第一条记录。
如果执行此查询以选择UPSERT键:设置为选择查询,端口将比较此查询的结果和输入的XML,以确定是INSERT还是UDPATE。例如,如果此字段设置为以下查询:
SELECT CustomerName WHERE CustomerAddress = 101 Main Street
然后端口将首先对数据库运行这个查询,然后在输入的XML中查找CustomerName元素,最后将该XML值与数据库返回的值进行比较。如果这些值匹配,那么端口将更新该记录,否则它将插入一个新记录。
INSERT
如果在输入映射中禁用UPSERT,端口将自动将操作设置为INSERT。端口将尝试为每个输入的XML文件插入新记录,而无需查询数据库来查看该记录是否已经存在。
LOOKUP
有些列有LOOKUP选项可用。端口检测到这些列与数据库中的另一个表有外键关系。如果LOOKUP已启用,端口将在插入前查询该外部表,并使用INSERT中返回的值。LOOKUP by:字段确定将使用哪一列来查询外部表。
例如,假设将采购订单插入数据库,其中“PO”表中的一个字段是CustomerID。假设输入的XML将有一个客户名称元素,但没有客户的内部标识。但是,数据库中的另一个表“Customers”既有名称又有标识,因此它可以用于根据名称查找标识值。端口将识别“Customers”表的CustomerID列是外键,并为该列启用LOOKUP。将LOOKUP by:设置为CustomerName将指示端口使用如下语句查询“客户”表:
SELECT CustomerID FROM Customers WHERE CustomerName = @CustomerName
在此查询中,@CustomerName代表输入XML中CustomerName元素中的值。
使用这种配置,端口将首先从“Customers”中检索客户标识,然后在插入“PO”表时使用该值。
XML形式的输入映射
输入映射用XML表示,结构如下:父元素标识要插入的表,每个子元素对应于目标表中的一列。输入映射建立了XML元素和数据库列之间的连接,以便端口可以从传入的XML文档中读取值,并在插入或更新查询中使用它们。
以下是“Students”表的输入映射示例:
1 2 3 4 5 6 7 8 |
<Items> <Students action="insert"> <StudentID key="true" /> <Name/> <Grade type="int"/> <GPA/> </Students> </Items> |
在上例中,学生标识、姓名、年级和平均成绩是“Students”表的每一列。当端口处理与该结构匹配的一个XML文件时,它会自动将该XML中的值插入到“Students”表中。以下是用于上述映射的示例XML输入文件:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
<Items> <Students> <StudentID>12554</StudentID> <Name>Ferris Bueller</Name> <Year>11</Year> <GPA>1.8</GPA> </Students> <Students> <StudentID>12921</StudentID> <Name>Hermione Granger</Name> <Year>9</Year> <GPA>4.0</GPA> </Students> </Items> |
当端口处理上述输入文件时,它将在“Students”表中插入或更新两条记录,每个学生元素一条记录。请注意,如果数据库可以通过自动增量自动生成主键,则表的主键不需要包含在输入的XML中。
批量导入
数据库端口支持批处理,以提高插入大数据集时的性能。批处理通过两个字段配置,事务大小和批处理大小。当这些字段设置为正整数时,端口将在单个操作(批处理)中插入[批处理大小]记录,并将在单个连接(事务)中插入[事务大小]记录。
一个XML输入文件可以包含比单个事务大小更多的记录,在这种情况下,端口将通过多个事务插入数据。
如果在批处理插入期间发生错误,端口将回滚事务并缓存失败事务中第一条记录的索引。重试输入文件时,只有缓存索引后的记录才会插入数据库。
插入到子表
输入映射支持使用单个映射插入多个表。当创建具有多个表的输入映射时,这些表应该彼此具有外键关系,这样一个表就是另一个表的子表。否则,使用多个输入映射插入到不通过外键相关的表中。
要插入子表,首先创建一个以父表为目标的输入映射。然后使用左上角的“添加”按钮从输入映射编辑器中添加子表。从表列表中选择适当的表,设计器将自动填充表的层次结构。选择应包含在输入映射中的子表列。
REF
子表中的一些列将用蓝色的“REF”来标记。端口检测到这些列对应于父表中的主键。在插入父表之后,在插入子表之前,端口将在父表中查询它刚刚插入的记录的主键。然后,端口将在插入子表时使用该值。
当父表的主键由数据库生成时,如自动增量键,这很有用。在这种情况下,该列不会作为输入XML传入,因此端口直到将记录插入父表后才知道该列的值。
在输入映射XML中,“ref”属性表示以后可以引用列,或者该列应该包含由数据库生成的具有保留值LAST_INSERT_ID的“ref”属性(例如AUTOINCREMENT主键):
1 2 |
<film action="upsert"> <film_id key="true" upsert="film_id" ref="@@LAST_INSERT_ID" /> |
这表示film_id值将在插入后被检索,并可在映射中稍后被引用(通常在子表中)。若要稍后引用该值,请将“ref”元素设置为“AUTOINCREMENT”列的名称:
1 |
<film_id key="true" ref="@film_id" /> |
在上例中,film_id是父表中主键的名称,也是子表中列的名称。“ref”语法指示端口在插入后从父表中检索film_id,并将检索到的值用作子表中的film_id列。
LOOKUP
子表的LOOKUP逻辑与父表相同。有关更多详细信息,请参见创建输入映射中的LOOKUP部分。
子表XML
当插入父表和子表时,输入映射XML结构将是多层的。以下是由外键关联的两个表的输入映射示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
<film action="upsert"> <film_id key="true" upsert="film_id" ref="@@LAST_INSERT_ID" /> <description /> <language_id /> <rating /> <release_year type="date" /> <title /> <film_actor> <actor_id key="true" /> <film_id key="true" ref="@film_id" /> <last_update type="datetime" /> </film_actor> </film> |
在上面的例子中,“film”是父表,“film_actor”是子表。film_id列是“film”表的主键,“film_actor”表中的外键。当数据库端口处理与此结构匹配的输入XML文件时,它将更新“film”和“film_actor”表,并确保链接两个记录的键是相同的。
输出映射
输出映射表示来自目标数据库中一个或多个表的选择查询。它们是通过可视化映射编辑器面板创建的,然后在内部建模为XML。从数据库返回的结果用于填充与输出映射结构匹配的XML文档。将数据库响应转换为XML的过程在输出映射为XML一节中有详细介绍。
创建输出映射
单击“添加映射”按钮创建新映射。从数据库中的可用表列表中选择目标表/视图,以调出映射编辑器面板。在映射编辑器中,选择应该在select语句中返回的表列。对于简单的SELECT,这就是生成映射所需的全部内容。
创建输入映射后,可以通过单击映射名称旁边的“执行”按钮(黑色播放按钮)来执行它所代表的查询。此外,可以通过单击映射名称旁边的“代码”按钮(</>)来查看映射的XML表示。
输出过滤器
映射编辑器包括一个“过滤器”面板,用于定义限制数据库返回的记录的规则。每个规则对应于结果选择查询中的WHERE语句,并将指定列与指定值进行比较,只提取具有匹配列值的记录。
规则与“与”和“或”逻辑运算符相结合,当应用许多规则时,可以将规则分组在一起以保持操作顺序。
输出映射为XML
输出映射用XML表示,结构如下:父元素标识要从中选择的表,每个子元素对应于目标表中的一列。输出映射建立了数据库列和XML元素之间的连接,以便端口可以从数据库结果中读取值,并使用它们来填充XML文档。
以下是“Students”表的输出映射示例:
1 2 3 4 5 6 7 8 |
<Items> <Students selectQuery="SELECT * FROM `Students` WHERE `GPA` = 4.0"> <StudentID key="true" /> <Name/> <Grade type="int"/> <GPA/> </Students> </Items> |
在上例中,StudentID、Name、Grade和GPA是“Students”表的每一列。执行输出映射时,端口将运行指定的选择查询,并为返回的每个记录生成一个XML文档。以下是上述映射的示例XML输出文件:
1 2 3 4 5 6 7 8 |
<Items> <Students> <StudentID>12921</StudentID> <Name>Hermione Granger</Name> <Year>9</Year> <GPA>4.0</GPA> </Students> </Items> |
批量输出
可以编辑输出映射XML,以支持将记录一起批处理到单个XML文档中。在与数据库表共享名称的元素中,“batchResults”属性可以设置为“true”。例如,在上面从“学生”表中选择结果的输出映射示例中,以下修改将确保结果是成批的:
1 2 3 4 5 6 7 8 |
<Items> <Students selectQuery="SELECT * FROM `Students` WHERE `GPA` = 4.0" batchResults="true"> <StudentID key="true" /> <Name/> <Grade type="int"/> <GPA/> </Students> </Items> |
请注意,如果在“SELECT”和“batchResults”启用期间出现错误,则可能很难确定哪些记录由于错误而未返回。
覆盖SELECT查询
输出映射XML显示将针对目标数据库运行的SELECT查询。端口基于输出映射中的设置构建该查询,但是如果需要对查询进行细粒度控制,则可以手动覆盖该查询。
只需编辑与表共享名称的元素的“selectQuery”属性,并将其设置为任意选择查询。
仅处理新的或更改的记录
输出映射可以配置为仅检索最近更新或添加的记录。端口可以使用两种方法来检测哪些记录是新的或修改的。
第一种方法需要一个DateTime列来表示记录的最后修改时间,第二种方法需要一个列来显式存储一个值,该值表示是否应该处理记录。
使用最后一次修改的列
在映射编辑器中,展开面板底部的高级设置。如果检测到日期时间列,该选项将可用于使用列来处理新的或更改的记录。将此设置为代表记录上次修改时间的适当日期时间列。
使用自定义列
输出映射可以配置为更新表中从数据库成功提取的记录的列,这可以与筛选器规则结合使用,该规则只选择具有列值的记录,该列值指示该记录尚未被拉取(或应该被再次拉取)。
要在处理后启用列更新,请展开映射编辑器底部的高级设置。成功处理行时,启用“用值更新列”,然后指定应更新哪个列以及应在该列中设置的值。
例如,输出映射可能配置为在提取记录后将已处理列更新为“1”。然后,可以应用过滤规则,将记录限制为仅处理不等于1的记录。
在本例中,当端口处理输出模板时,它会基于模板创建一个SELECT语句。模板将执行“选择标识、帐户标识、发票金额”,根据模板为结果集中的每条记录创建一个XML文件,并将这些文件放在该端口的输出文件夹中。
从多个表中选择
输出映射支持使用单个映射查询多个表。当创建具有多个表的输出映射时,这些表应该彼此具有外键关系,这样一个表就是另一个表的子表。否则,使用多个输出映射从不通过外键相关的表中进行选择。
要查询子表,首先创建一个以父表为目标的输出映射。然后使用左上角的“添加”按钮从输出映射编辑器中添加子表。从表列表中选择适当的表,设计器将自动填充表的层次结构。选择子表中应包含在输出映射中的列。
以下是包含子表的输出映射示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
<Invoice selectQuery="SELECT * FROM `Invoice` "> <Id key="true"/> <Account/> <AccountId/> <Amount/> <AppliedAmount/> <Balance/> <BillingCity/> <BillingCountry/> <BillingLine1/> <BillingPostalCode/> <BillingState/> <InvoiceLineItem table="INVOICELINEITEM"> <Id/> <InvoiceId ref="@Id"/> <ItemAmount/> <ItemName/> <ItemQuantity/> </InvoiceLineItem> </Invoice> |
发票行项目XML中的记录与其父项发票相关联,发票由XML中的“引用”属性标识。此属性指示端口使用WHERE子句为“InvoiceLineItem”表生成一个SELECT语句,该子句从父记录中标识InvoiceId。一张父发票可以有多个发票行项目元素。
注:文案部分图片及内容来源于网络,版权归原创作者所有,如有侵犯到您的权益,请您联系我们进行删除,给您带来困扰,我们深感抱歉。