做一个简单的QueryService,在跟踪过程中发现,客户端一个查询,会被触发两次。怎么会这样,这严重影响服务器性能。
客户端的代码非常简单,就是执行一个SQL,通过QueryService返回结果:
kbmMWClientQuery2.Close;
kbmMWClientQuery2.Open;
于是利用服务器端的QueryService的事件OnQueryStatement进一步检查SQL的执行情况,把SQL写到Memo中:
procedure
TkbmMWQueryService3.kbmMWQueryServiceQueryStatement(Sender:
TObject;
Place: TkbmMWQueryOperationType; var
NamedQueryName, Statement: string);
begin
Form1.Memo1.Lines.Add(Format('Named Query:%s |
Statement:%s',[NamedQueryName,Statement]));
end;
用dbMonitor检查也是重复的:
发生这个问题,是因为在服务器端的Query,需要先从数据库中查询出表的结构及查询使用的参数,然后再查询数据记录。
解决该问题的方法:
1:利用Cache制,对Metadata进行缓存,用以取代每次查询都要从数据库中先查询出结构;在服务器端及客户端都可以利用Cache.
kbmMWClientQuery2.Cached:=True;
kbmMWClientQuery2.CacheFlags:=[mwcfDontAge,mwcfDontGarbageCollect,mwcfDefsOnly];
2:设置Query的AutoFieldOnOpen:=mwafoWithData;
关于如果使用kbmMW的Cache,参见昨天写的内容。