使用 DataConnection 的注意事项
对业务规则引擎使用 DataConnection 时,应考虑以下注意事项。
使用主键
如果存在主键,则两行是否相等是由它们是否具有相同主键来确定的,而不是由对象比较确定。 如果确定两行相同,则内存中将只保留一个副本,另一行将被释放。 这样可以消耗较少的内存。
首次将 DataConnection 断言到规则引擎中时,引擎始终尝试从其架构中查找其主键信息。 如果存在主键,则随后将检索该主键信息并在所有后续评估中使用该信息。
注意
如果需要对数据库进行更改,则主键是必需的。
在所有可能的情况下向 DataConnection 提供运行的事务
如果没有事务, DataConnection 上的每个查询和更新都会启动自己的本地事务,不同的查询可能会在规则评估的不同部分返回不同的结果。 如果底层数据库表中发生了更改,则用户可能会遇到不一致的情况。
尽管可以在表不随时间变化的情况下使用 DataConnection 而不提供事务,但即使 DataConnection 仅用于读取操作,也建议使用事务。
不过,在更新数据时应始终使用事务。
查询数可能呈线性增长
由于针对 DataConnection 的查询由其他联接对象参数化,因此针对 DataConnection 执行的查询数直接对应于到达 DataConnection 的联接对象数。 因此,如果到达 DataConnection 对象的联接对象数呈线性增长,则针对 DataConnection 的查询数也将线性增长。 目前尚没有适当的优化可用于减少查询数。
以下规则是此类情况的一个示例:
IF A.x = 7 AND DC.y = A.y
THEN
表示 ObjectBinding,DC 表示 DataConnection,x 和 y 表示 A 和 DC 的属性。
对于通过测试 (x = 7) 的每个 A 实例,将使用 DataConnection 生成查询。 如果存在多个匹配的实例,则会生成相同数量的查询。
谨慎使用 OR 条件
如果规则仅使用串联 (AND) 条件,则会尽早执行测试和查询,因此传递的对象实例将减少。 因此,针对后续 DataConnection 的查询数将按比例减少。 如果分离 (OR) 条件和 DataConnection 一起使用在规则中,则所有条件评估都将推送到最终查询。 如果在一个规则中使用了多个 DataConnection ,则除最后一个查询之外的所有查询都将有效地成为 Select-ALL 查询语句。
通常情况下,最好将任何带有 OR 条件的规则拆分为两个或多个离散的规则,因为与多个原子规则的定义相比,使用 OR 条件将会降低性能。 无论是否使用 DataConnections 都是如此。
还可以考虑使用仅包含结合条件的单独规则,而不是包含 OR 条件的一个规则。 使用 OR 条件时,查询数以所有联接对象的实例乘法的速度增长。 下面的示例说明了这一点。
IF (A.x ==7 OR A.x == 8) AND DC.y == A.y
THEN DC.z = 10
在此示例中,A 表示 ObjectBinding;DC 表示 DataConnection,x、y 和 z 表示 A 和 DC 的属性。 如果 A 具有 100 个实例,并且 x 在第一个对象中为 1,在第二个对象中为 2,在第 100 个对象中为 100,则必须针对 DataConnection 运行 100 个查询。
最好通过将上述规则拆分为两个规则来对其进行重新编写。
规则 1
IF A.x =7 AND DC.y = A.y
THEN DC.z = 10
规则 2
IF A.x = 8 AND DC.y = A.y
THEN DC.z = 10
SQL 不支持某些谓词和函数
SQL 不支持规则引擎支持的某些谓词和函数。 如果规则条件中使用了这些不受支持的谓词和函数,则无法将该规则合并到查询中。 不能将以下术语作为 SQL 查询进行优化:
某些引擎内置函数在 SQL 查询中没有任何等效项。 它们是 Power、 FindFirst 和 FindAll。 不能将 DataConnection 列用作其一个或多个参数作为查询的一部分进行优化;例如,Power ( 2、dc.Column1) 。
使用 DataConnection 列作为其正则表达式参数的内置谓词匹配 (第一个参数) 。 例如,Match("abc*", dc1.Column2) 有效,但 Match(dc1.Column1, dc1.Column2) 无法进行翻译。
使用具有 DataConnection 列作为其参数之一的用户函数。 例如,无法优化 c1.M(dc.Column1),因为用户函数无法在数据库服务器上执行,但却必须由业务规则引擎执行。
表示 DataConnection 上的设置操作的用户函数;例如,dc.Column1 (5) 。
对 DataConnection 使用 ObjectReference 的函数;例如,ObjecRef (dc) 。
如果函数的一个或多个参数无法进行翻译,则将无法翻译该函数调用,例如 Add(c1.M(dc.Column1), 5)。