SymmetricDS文档翻译--【Chapter3.详细配置(Configuration)[sectionC]】(二)

2015-02-03 10:06:06 · 作者: · 浏览: 29
ect','corp','store', 'column', 'STORE_ID=:REDIRECT_NODE',current_timestamp, current_timestamp);

在router_expression中可以配置多个列。当配置超过一个列时,所有的匹配成功的节点都会被加到要被路由的节点列表中。下面是一个简单的例子,一个表中,STORE_ID列的值需要等于一个节点的EXTERNAL_ID或者是ALL常量,等于ALL常量意味着所有的节点都会收到数据更新。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-multiple-matches','corp','store', 'column',
               'STORE_ID=ALL orSTORE_ID=:EXTERNAL_ID', current_timestamp,
               current_timestamp);

NULL关键字可以被用来检查一个列是否为空。如果列为空,数据将被路由到所有的节点。下面的例子中,当STORE_ID列被用来路由到节点EXTERNAL_ID等于STORE_ID的节点,如果STORE_ID是空,就路由的所有的节点。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-multiple-matches','corp','store', 'column',
               'STORE_ID=NULL orSTORE_ID=:EXTERNAL_ID', current_timestamp,
               current_timestamp);

3.6.3. Lookup Table Router

一个lookup表可能包含数据要被路由的节点的ID。这可能是个已经存在的表或者一个特地为了路由数据被增加的附属的表。Lookup Table Router通过在往ROUTER插入一个router时指定router_type的值为lookuptable来配置,可以再router_expression列中设置多个配置参数。

下面的每一个配置参数都是必须的。

LOOKUP_TABLE

Lookup table的名字。

KEY_COLUMN

将要被router的表中的列的名字。这将作为主键插入到lookup表中。

LOOKUP_KEY_COLUMN

Lookup表中的主键的列的名字。

EXTERNAL_ID_COLUMN

这是一个列的名字,这个列包含了lookup表中要被路由的节点的external_id。

注意,lookup表将被读到内存中缓存起来,以备数据在route到一个channel期间使用。

考虑到一个表可能被路由到某个特定的store,但是变化的表的数据只包含品牌信息。在这个例子中,STORE表可以被用作lookup表。

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, last_update_time) values
               ('corp-2-store-ok','corp','store', 'lookuptable', 'LOOKUP_TABLE=STORE
               KEY_COLUMN=BRAND_IDLOOKUP_KEY_COLUMN=BRAND_ID
               EXTERNAL_ID_COLUMN=STORE_ID',current_timestamp, current_timestamp);

3.6.4. Subselect Router

有时候,需要基于当前没有正在同步的数据来判断是否需要路由当前的数据。Subselect Router可以在这种情况下使用。Subselect Router的router_expression列要配置一个SQL查询语句,这个SQL语句返回需要被路由的节点的ID的列表。Column符号可以用在SQL表达式中,这些符号可以被一行数据中的指定的列替换。使用这种Router有很高的开销,因为Subselect语句将会为每一个要路由的行运行一次。这不应该用在有很多行需要更新的表中。这种Router也有一个缺点,如果用来决定要路由的节点的ID的数据已经被删除,SQL语句将不会返回结果,路由操作将不会发生。

你指定的Router_expression可以加到下面的SQL语句中,以选择节点的ID:

select c.node_id from sym_node c where
               c.node_group_id=:NODE_GROUP_IDand c.sync_enabled=1 and ...

正如你看到的,你可以用别名“c”来访问当前正在处理的节点的信息,例如c.external_id。有两个节点相关的符号你可以用在你的表达式中:

1. :NODE_GROUP_ID

2. :EXTERNAL_DATA

代表你的数据的列明需要有冒号前缀,例如”:EMPLOY_ID”,或者”:OLD_EMPLOYEE_ID”。在这里,“OLD_”前缀表明这个值是发生数据变化之前的值。

例如,考虑下面的情况,一个“Order”表和一个“OrderLineItem”表需要被路由到某个特定的store。“Order“表有一个名叫”order_id“和”STORE_ID“的表。一个store节点有一个与“Order“表的STORE_ID相等的external_id。但是,”OrderLineItem“表,只有一个外键到”Order“表的”order_id“。为了路由”OrderLineItem“的数据到”Order“表要路由到的节点,我们需要引用“Order“表的记录。

在SymmetricDS中,有两种可能的方式来解决这个问题。一个是配置一个“Subselect“类型的Router,如下(另一种方式是使用external_select通过触发器捕获数据,然后在column router中使用这个数据匹配,详细的描述在Section3.6.7 ,”Utilizing External Select when Routing“)。

我们的解决方案是利用Subselect比较当前节点的external id和Order表中的STORE_ID列的值,当order_id等于当前行的order id时就路由这个数据:

insert into SYM_ROUTER (router_id,
               source_node_group_id,target_node_group_id, router_type,
               router_expression,create_time, l