MapGuide服务器在将查询结果返回给客户端的时候,并不是将查询结果一次性返回给客户端,它使用了类似于数据库中Fetch Size的技术来改善读取查询结果集的性能。假设Fetch Size为100,当服务器端执行完查询得到结果集后,服务器端会创建一个服务器端结果集读取器,从要素源读取前100个结果,然后将这100个结果一次性返回给客户端,并且在客户端创建一个客户端结果集读取器,MgDataReader、MgFeatureReader和MgSqlDataReader都是客户端结果集读取器。当用户调用客户端结果集读取器的方法ReadNext()读取到第101个结果的时候,客户端结果集读取器会发送请求给服务器以返回第101~200个结果,对应的服务器端结果集读取器会读取第101~200个结果返回给客户端;当用户继续调用方法ReadNext()读取到第201个结果的时候,客户端结果集读取器会发送请求给服务器以返回第201~300个结果,如此反复,直到服务器返回给客户端所有的结果。当客户端关闭或销毁客户端结果集读取器之后,对应的服务器端结果集读取器也会随之关闭和销毁。
从Fetch Size的工作流程,我们可以看到:
l Fetch Size 是设定客户端读取查询结果时每次从服务器端返回的结果数,它是一个性能调节参数,它只是影响了客户端和服务器端返回查询结果的往返次数,并不会影响查询结果。
l 每个客户端结果集读取器对应一个服务器端结果集读取器,在客户端结果集读取器关闭或销毁之前,服务器端结果集读取器始终驻留在服务器端,并且占用FDO连接池中的一个连接以读取第n个FetchSize个结果集返回给客户端,所以在不需要客户端结果集读取器的时候要马上关闭和销毁它,这样服务器结果集读取器才能随之销毁,从而释放占用的FDO连接使其它客户请求能够重用此FDO连接,例如在下面的代码中读取完所有的结果后,马上调用MgReader::Close()方法关闭客户端结果集读取器。
$reader = $featureService->ExecuteSqlQuery($featureSourceId, $commandText); while ($reader->ReadNext()) { ...... } $reader->Close(); |
Fetch Size是一个性能调节参数,服务器端无需一次性地将查询结果集返回给客户端,而是按需分批分次地将结果集返回给客户端,减少了单次网络传输的数据,提高了客户端的响应速度。当Fetch Size的值越大,客户端和服务器端通信的次数越少,单次网络传输的数据越多;Fetch Size的值越小,客户端和服务器端通信的次数越多,单次网络传输的数据越少。所以,用户需要根据MapGuide服务器使用的网络带宽、并发访问的用户数等信息调整Fetch Size的值。
通过修改MapGuide服务器配置文件serverconfig.ini中DataCacheSize属性的值可以配置FetchSize的大小,下面的示例中将FetchSize的大小设置为100。
[FeatureServiceProperties] DataCacheSize = 100 |