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. Codefores 1151E Number of Components

    大意:给定n元素序列$a$, $1\le a_i \le n$, 定义函数$f(l,r)$表示范围在$[l,r]$以内的数构成的连通块个数, 求$\sum\limits_{i=1}^{n}\sum\l ...

  2. Linux在shell中输入历史命令

    在Linux的shell中,经常输入的命令有很多雷同,甚至是一样的, 如果是长命令,再次敲一遍效率真的是很低, 不过可以通过Ctl+r,  查找history中以前输入的命令,很是好用. 按Ctrl+ ...

  3. Hadoop介绍-4.Hadoop中NameNode、DataNode、Secondary、NameNode、JobTracker TaskTracker

    Hadoop是一个能够对大量数据进行分布式处理的软体框架,实现了Google的MapReduce编程模型和框架,能够把应用程式分割成许多的 小的工作单元,并把这些单元放到任何集群节点上执行.在MapR ...

  4. GCC 命令行详解 -L 指定库的路径 -l 指定需连接的库名 zhuan

    1.gcc包含的c/c++编译器gcc,cc,c++,g++,gcc和cc是一样的,c++和g++是一样的,(没有看太明白前面这半句是什么意思:))一般c程序就用gcc编译,c++程序就用g++编译 ...

  5. Oracle.PL/SQL高级

    一.匿名块 .使用returning ... INTO 保存增删改表数据时的一些列的值 ()增加数据时保存数据 DECLARE v_ename emp.ename%TYPE; v_sal emp.sa ...

  6. laravel中的登录页面逻辑

    <?php namespace App\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades ...

  7. jquery checkbox的使用

    获取单个checkbox选中的写法: $('input:checkbox:checked').val(); $("input:[type='checkbox']:checked") ...

  8. Date和 Calendar

    import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Calendar; impor ...

  9. python 数据如何保存到excel中--xlwt

    第一步:下载xlwt 首先要下载xlwt,(前提是你已经安装好了Python) 下载地址:  https://pypi.python.org/pypi/xlwt/   下载第二个   第二步:安装xl ...

  10. MySQL/MariaDB 版本选择

    ALPHA.BETA.Release Candidate(RC).Release.GA等版本号的意义 MySQL数据库会存在很多版本,在这么多的版本中,我们如何进行选择,那么,首先我们要了解各个版本号 ...