kbmMW提供了TkbmMWClientQuery查询组件,作为kbmMW开发者都知道,这是一个内存数据集,基于服务端的查询服务(Query Service),可以直接执行sql得取想要的记录,因为是内存表,可以直接增、删、改记录,并利用Resolve方法提交修改到服务器,同时,也支持事务,利用kbmMWClientTransactionResolve组件,在事务中一次提交多个数据集。

利用ClientQuery组件,就可以轻松将原来的两层应用,如基于ADO设计的系统,移置到kbmMW多层架构上来,方便快捷,无缝升级旧有系统,这不得不佩服kbmMW作者的功力,做出如此易用的kbmMW多层架构。

如果你还不知kbmMWClientQuery的用法,可以学习以前一的文章,在这里:kbmMW实现sql查询。在这篇文章里,没有提及到kbmMWClientQuery.Client属性,也实现了查询,那这个Client有什么作用呢?这正是本文要解释的内容。

kbmMWClientQuery.Client是TkbmMWCustomSimpleClient类型,TkbmMWSimpleClient是继承自TkbmMWCustomSimpleClient的组件,其作用是向服务端发送请求,并可取得服务端返回的结果。更具体说,就是调用服务端实现的方法,这是kbmMW框架中最基础的类。在窑洞洞主的系列文章中第一个例子就是介绍如何实现服务端方法并通过SimpleClient来调用,不清楚可以先去看看,先理解SimpleClient的作用。

当理解了SimpleClient的作用,对于kbmMWClientQuery.Client属性就不难理解,实际上kbmMWClientQuery就是通过Client属性,调用服务端查询服务的方法,以执行sql取得返回结果集。那问题来了,当我们不设置Client属性,kbmMWClientQuery又是怎么发送的查询请求呢?通过源码,就会明白,不管kbmMWClientQuery.Client属性是否为nil,都会自己在内部建立一个SimpleClient实例。当ClientQuery.Client为nil,则通过这个实例与服务端通信,执行服务端查询服务的各种内置方法。如果为kbmMWClientQuery.Client指定了一个SimpleClient,kbmMWClientQuery就会使用指定的SimpleClient与服务端通信,为什么要这样设计呢?其目的就是多个ClientQuery共享一个SimpleClient。而共享一个SimpleClient的好处就是开发者可以为SimpleClient设置好需要传递给服务端的数据,而不用每次都做重复处理,这又是哪些数据呢?比如:用户名与密码,还有就是自己特定的数据。

说了这么多,我想已经说清了kbmMWClientQuery.Client的作用,并且如何使用他。但这都是在主线程中去实现,没有问题,如果在多线程中使用ClientQuery,并且共享一个SimpleClient,那问题就来了,SimpleClient不是线程安全的,我们不能这么干,否则你的应用就不稳定了,会出现各种地址错误。很多kbmMW初级开发者会因为这个问题认为kbmMW框架不稳定。

解决这个问题,就是利用ClientAsTemplate属性,将他设置为True,通过源码,我们会看到,如果ClientAsTemplate为True,当ClientQuery获取SimpleClient时,会使用内部的SimpleClient,同时复制Client属性对应的实例内容到内部的SimpleClient。然后再用内部的SimpleClient调用服务端的方法。

上面所说的逻辑在ClientQuery.GetActiveClient实现代码中,当ClientQuery要执行服务端方法时,就是通过这个方法取得SimpleClient,然后用他去调用服务端方法。可以进一步参考ClientQuery.GetMetaData等方法,这些方法中,可以清晰的看到使用GetActiveClient方法取得SimpleClient。

ClientAsTemplate用法的更多相关文章

  1. EditText 基本用法

    title: EditText 基本用法 tags: EditText,编辑框,输入框 --- EditText介绍: EditText 在开发中也是经常用到的控件,也是一个比较必要的组件,可以说它是 ...

  2. jquery插件的用法之cookie 插件

    一.使用cookie 插件 插件官方网站下载地址:http://plugins.jquery.com/cookie/ cookie 插件的用法比较简单,直接粘贴下面代码示例: //生成一个cookie ...

  3. Java中的Socket的用法

                                   Java中的Socket的用法 Java中的Socket分为普通的Socket和NioSocket. 普通Socket的用法 Java中的 ...

  4. [转载]C#中MessageBox.Show用法以及VB.NET中MsgBox用法

    一.C#中MessageBox.Show用法 MessageBox.Show (String) 显示具有指定文本的消息框. 由 .NET Compact Framework 支持. MessageBo ...

  5. python enumerate 用法

    A new built-in function, enumerate() , will make certain loops a bit clearer. enumerate(thing) , whe ...

  6. [转载]Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法总结

    本文对Jquery中$.get(),$.post(),$.ajax(),$.getJSON()的用法进行了详细的总结,需要的朋友可以参考下,希望对大家有所帮助. 详细解读Jquery各Ajax函数: ...

  7. 【JavaScript】innerHTML、innerText和outerHTML的用法区别

    用法: <div id="test">   <span style="color:red">test1</span> tes ...

  8. chattr用法

    [root@localhost tmp]# umask 0022 一.chattr用法 1.创建空文件attrtest,然后删除,提示无法删除,因为有隐藏文件 [root@localhost tmp] ...

  9. 萌新笔记——vim命令“=”、“d”、“y”的用法(结合光标移动命令,一些场合会非常方便)

    vim有许多命令,网上搜有一堆贴子.文章列举出各种功能的命令. 对于"="."d"."y",我在无意中发现了它们所具有的相同的一些用法,先举 ...

随机推荐

  1. Python特点

    用一种方法,最好只用一种方法来做一件事 1.面向对象(解决一个问题,先考虑由“谁”来做,怎么做是“谁”的职责) 函数.模块.数字.字符串都是对象 在Python中一切皆对象 完全支持继承.重载.多重继 ...

  2. java类的设计原则

    1.内聚性 类应该描述一个单一的实体,所有的类操作应该在逻辑上相互配合,支持一个连贯性的目标.例如:学生和教职工属于不同的实体,应该定义两个类. 2.一致性 要遵循一定的设计风格和命名习惯.给类.方法 ...

  3. 『TensorFlow』第十一弹_队列&多线程&TFRecod文件_我辈当高歌

    TF数据读取队列机制详解 一.TFR文件多线程队列读写操作 TFRecod文件写入操作 import tensorflow as tf def _int64_feature(value): # val ...

  4. 『TensorFlow』SSD源码学习_其一:论文及开源项目文档介绍

    一.论文介绍 读论文系列:Object Detection ECCV2016 SSD 一句话概括:SSD就是关于类别的多尺度RPN网络 基本思路: 基础网络后接多层feature map 多层feat ...

  5. hive的jdbc使用

    ①新建maven项目,加载依赖包  在pom.xml中添加 <dependency> <groupId>jdk.tools</groupId> <artifa ...

  6. 回收站(recyclebin)及回滚

    1. alter table table_name enable row movement; flashback table table_name  to timestamp  to_timestam ...

  7. Leetcode 131

    class Solution { public: vector<vector<string>> partition(string s) { vector<string&g ...

  8. 这样好用的ReactiveCocoa,根本停不下来

    作者:空之境界(博客) 前戏我个人非常推崇ReactiveCocoa,它就像中国的太极,太极生两仪,两仪生四象,四象生八卦,八卦生万物.ReactiveCocoa是一个高度抽象的编程框架,它真的很抽象 ...

  9. this.$route和this.$router的区别

    1. this.$router: 表示全局路由器对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(), go()等方法: 2. thi ...

  10. Python3组播通信编程实现教程(发送者+接收者)

    一.说明 1.1 标准组播解释 通信分为单播.多播(即组播).广播三种方式 单播指发送者发送之后,IP数据包被路由器发往目的IP指定的唯一一台设备的通信形式,比如你现在与web服务器通信就是单播形式 ...