[转载红鱼儿]kbmmw 开发点滴:kbmMW缓存机制

kbmMW提供了稳顾机制,分为服务端的Cache及客户端的Cache。以客户端为例,当客户端发出相同的数据查询请求时,kbmMW会在客户端的Cache中查找,如果找到,则不再向服务器请求数据。

为了启用一个ClientQuery使用稳存,首先要设置其以下两个属性:

kbmMWClientQuery.Cached:=True;//打开数据集的稳存

kbmMWClientQuery.CacheFlags:

  • mwcfDontAge - 缓存的内容不过期,一直在Cache保留
  • mwcfDontGarbageCollect - 缓存的内容不做垃圾回收,效果同mwcfDontAge
  • mwcfDefsOnly - 仅缓存数据集的定义,包括字段定义及参数定义
  • mwcfUpdateOnResolve - 如果数据集被解析(对数据集的修改向服务器做了提交)则缓存内容将用新的数据、字段及参数定义更新,即对数据集进行重新缓存
  • mwcfLeaveOnResolve - 如果数据集被解析(对数据集的修改向服务器做了提交)则从缓存中删除
  • mwcfNoParamsInCacheID - 数据集的参数不做为Cache ID的内容(Cache ID是一个字符串,缓存一个数据集时生成的名称,如果不用参数做为名称的一部分,则数据集用不同的查询参数时,将共用一个缓存内容)
  • mwcfIgnoreCachedParams - 没启用.

其次,还要对ClientConnectionPool设置:

kbmMWClientConnectionPool1.EnableCache:=True;kbmMWClientConnectionPool1.MaxCacheAge:=30;kbmMWClientConnectionPool1.MaxCacheEntries:=100;kbmMWClientConnectionPool1.MaxCacheRecordCount:=10000;
客户端的请求代码:
procedure TForm2.btnLoadData(Sender: TObject);
begin
  kbmMWClientQuery1.Close;
  kbmmWClientQuery1.Query.Text:='@T1';
  kbmMWClientQuery1.FieldDefs.Update;
  kbmMWClientQuery1.Params.ParamByName('F1').AsInteger:=5;
  kbmMWClientQuery1.Open;
  kbmMWClientQuery2.Close;
  kbmMWClientQuery2.Open;
end;
利用dbmonitor查看SQL执行情况,当第二次点击btnLoadData按钮时,dbMonitor中不再有查询SQL被执行。
同样的方法,适用于服务器端。在测试中发现,作为QueryService的Query属性的数据集,不能被缓存,不知什么原因。经向xalion求教,才明白:原来做为QueryService的默认Query,因频发被调用,出于性能考虑,所以不应该缓存,那在服务器端的缓存机制,实际上就是对命名查询(Named Query)数据集的处理,因他的SQL是静态不变的。
时间: 2024-10-26 11:24:37

[转载红鱼儿]kbmmw 开发点滴:kbmMW缓存机制的相关文章

[转载红鱼儿]kbmmw 开发点滴:kbmMW在事务中批量执行SQL

按客户端使用事务更新多个表数据到kbmMW服务器,使用TkbmMWClientTransactionResolve, 可以一次性提交多个修改的数据集到服务器端,服务器利用事务来执行数据的更新,成功,提交事务,不成功,则Rollback事务.在实际开发中,可能遇到 在更新数据集的同时,还要执行单独的SQL,处理业务逻辑.方法是:用一个单独的TkbmMWClientQuery来执行.具体用法: kbmMWClietnQuery3.Query.Text:='Update T1 Set F2=1 whe

[转载红鱼儿]kbmmw 开发点滴:kbmMW客户端提交事务的现场处理

多层应用中的事务处理,是必须的,如果处理不好,就会出现各种数据不同步的现象,无法投入使用.以前用ASTA实现的多层应用,是在客户端利用ASTA机 制,将要提交的数据集.执行的SQL及SP,统统生成到一个脚本中,在ASTA是TAstaParamList,然后一次性提交到服务器,在服务器端在执 行这个脚本时,开启事务,执行脚本,如果成功则Commit,失败则Rollback. kbmMW提供了更好的事务处理机制,即可以在服务器端做事务处理(TkbmMWTransactionResolve)也可以在客

[转载红鱼儿]kbmmw 开发点滴:kbmMW:Unknown property:indexes

利用kbmMW的QueryServices,对数据集进行提交,当改用JSON格式时,客户端提交时,会产生这个错误,明明已经更新数据库,也产生这个错误!如果换成Bin格式,则正常. 能过查看kbmMWJSONStreamFormat单元,问题产生在这行代码:nIndexDefs:=nDefs.AsArray['indexes']; 可以这样理解: 客户端提交数据后,服务器会返回一个错误结果数据集,不管有无错误,都要返回这个结果集.客户端会把这个数据集加载到 ClientQuery.ErrorTab

[转载红鱼儿]kbmmw 开发点滴:kbmMW默认服务

这两天,用xalion的入门文章学习kbmMW的使用,当用kbmMW向导生成一个Service后,需要注册到kbmMWServer中,具体的方法在生成的Service中已经有说明: // INSTRUCTIONS FOR REGISTRATION/USAGE // ----------------------------------- // Please update the uses clause of the datamodule/form the TkbmMWServer is place

[转载红鱼儿]kbmmw 开发点滴:kbmMW数据集流化

kbmMW提供了QueryService,供我们在客户端象传统数据库应用一样,直接利用ClientQuery做SQL查询,以及提交,并且能够在客 户端以事务的方式提交多个数据集,应该说,QueryService为我们提供了非常好的便利,快速将两层应用转为多层应用,如果用过ASTA,就会发 现,QueryService在对两层应用的转化上,要比其实现的更完美,层次更清晰.但在实际项目中,如果考虑应用服务器对多平台的支持以及业务逻辑的 集中实现,那么仅仅使用QueryService是不够的,我们可能

[转载红鱼儿]kbmmw 开发点滴:kbmmW服务端事务控制

关于kbmMW的事务控制,前文已经在客户端实现,通过kbmMWClientTransaction来控制多个数据集的提交,在客户端提交多数据集,实际上,是在客户端实现业务逻辑,并通过一个事务来完成数据处理,这是违反多层架构的做法,实际项目中,需要在服务端,往往是利用多个数据集进行业务处理,并且用事务来控制,那我们该怎么办呢?换句话说,如何在服务实现事务的控制. kbmMW在服务端,如同在客户端一样,为我们提供了方便的机制来处理事务. 下面的代码,转自kbmMW的新闻组: var tx: TkbmM

[转载红鱼儿]kbmmw 开发点滴:QueryService运行机制

总结一下这两天学习QueryService,一个SQL从客户端是如何从服务端取得查询结果的. 客户端: 1.第一个出场是是内存表,这要用到的kbmMWClientQuery,从TkbmCustomMemTable继承而来,通过Query属性准备 SQL语句,利用QueryService及QueryServiceVersion指定使用服务端ServiceName及Version:2.接下来出场的是:kbmMWClientQuery属性ConnectionPool联接的kbmMWClientConn

[转载红鱼儿]kbmmw 开发点滴:解决QueryService重复查询问题

做一个简单的QueryService,在跟踪过程中发现,客户端一个查询,会被触发两次.怎么会这样,这严重影响服务器性能. 客户端的代码非常简单,就是执行一个SQL,通过QueryService返回结果:   kbmMWClientQuery2.Close;   kbmMWClientQuery2.Open; 于是利用服务器端的QueryService的事件OnQueryStatement进一步检查SQL的执行情况,把SQL写到Memo中: procedure TkbmMWQueryService

[转载红鱼儿]kbmmw 开发点滴:There be must at least one field

There be must at least one field 用uniDAC+kbmMW+SQL Server做服务器,当客户端查询时,出现这个错误,在QQ群请教,一位朋友说,在服务器端查询不对,憋了一天,最终,朋友改了TkbmMWUNIDACConnection,得以解决,原来是这样,如果uniDAC+SQL Server,则需要调用CoInitialize.而kbmMWUNIDACConnection中没有调用. 代码如下,红色是需要增加的代码,当然仅对于MS SQL Server,对于