zoukankan      html  css  js  c++  java
  • 关于informatica的Dynamic Lookup组件使用中遇到的一个问题的思考

    Dynamic Lookup组件是Lookup组件的一个分支,主打动态缓存查询;平常的Lookup组件的缓存都是静态的,即从查询表中将数据全部读入缓存中后,如果查询表中的数据该表,那么缓存中的数据也不会随之而变,为了解决这个问题就有了Dynamic Lookup组件,查询表中的数据变化会同步到缓存中,我这篇文章不说这个组件怎么用,仅仅是记录下在学习杜绍森老师的《informatica powercenter 权威指南》的时候在Dynamic Lookup组件遇到的问题。

    在《权威指南》中介绍Dynamic Lookup的例子,最开始是用Lookup组件直连目标表,这种直连最后会在运行第三次工作流时报错,报错信息为:CMN_1650 试图将重复行插入动态查找缓存中,动态查找缓存只支持唯一条件键;经过分析,像书中举例的源表除非是表中都是全新的数据(就算是修改原数据而产生的也会有问题),因为Lookup组件本质上是通过设置“条件”选项中的查找列来进行匹配的,例如例子中的ID=ID_IN,一开始目标表中没有ID=1的数据,那么运行工作流的时候ID=1的数据就会被插入到目标表中,它的newLookupRow=1,此时目标表中就有了一条ID=1的数据;运行第二次工作流的时候会把缓存中的数据更新,那么缓存中也有了一条ID=1的数据,这时根据Dynamic Lookup的运行特点,在缓存中找到了这条记录,那么就应该是更新或者不动,根据例子中的意思,应该是更新这条记录的某个字段,那么将其newLookupRow=2,然后插入到目标表,此时目标表中有两条ID=1的数据,第三次运行工作流时,会将这两条ID=1的记录都读入缓存中,这就造成了CMN_1650错误。

    在后面的时候在这个工作流的mapping中加入了update strategy组件,这样可以对每一条数据进行处理,其属性页中的update strategy expression中的条件为:decode(NewLookupRow,1,DD_INSERT,2,DD_UPDATE,DD_REJECT),即对每条数据,如果传到update strategy组件中,其newlookuprow为1则插入,为2,则对相关数据进行update操作,其他的抛弃,这样就可以保证目标表中始终只有一条ID=1的数据,当然,将ID列设为虚拟主键,才会有这种效果。

  • 相关阅读:
    【转】系统缓存全解析二:动态缓存(4)-第三方分布式缓存解决方案 Velocity
    DevExpress.XtraTreeList.TreeList 的一些解决办法
    【转】系统缓存全解析二:动态缓存(4)-Discuz!NT中集成Memcached分布式缓存
    c#遍历Dictionary
    【转】memcached 命令概述
    WSAWaitforMultEvent使用
    创建线程是否调用CloseHandle
    小序
    select模式学习(二)之:客户端
    CoInitlize使用
  • 原文地址:https://www.cnblogs.com/JSD1207ZX/p/9414631.html
Copyright © 2011-2022 走看看