用Cacheobject的类方法查询一下数据,用method的方法去取结果,结果用时15秒才取出和呈现了288条数据。
这么慢的速度显而是无法接受的。
Cache数据库本身应该是考虑了这个问题的,一是String类型的数据本身就有长度限制,二是Method或者ClassMethod也只能是调用一些参数或者返回值不多的方法。
面对大量数据的查询和返回,Cache就搞了一个Query,完成一个Query的定义并不容易,也从某程度上来说是设计的不怎么好,后期加上去的。
一、传统的多条数据的取法:
1、定义个进程global用来存储数据
s ^||List(1)=data1
s ^||List(2)=data2
…
2、然后用一个Method GetData来获取某一行
Method GetData(pNum As %Integer = 0) As %String
{
Q ^||List(pNum)
}
嗯,然后就是很简单的数据288条都需要15秒才能加载完,因为要建立288次连接然后去取数据。
二、Query的定义:
1、先申明一个Query的方法,里面啥都不需要。
Query GetOrderList() As %Query(ROWSPEC = "code,name") [ SqlProc ]
{
}
2、再搞一个执行函数Excute,将你要的结果查询出来并保存在一个进程global中:
ClassMethod GetOrderListExecute(ByRef qHandle As %Binary) As %Status [ Internal ]
{
k ^||List
s ^||List(0)=$lb(data1,data2)
s ^||List(1)=$lb(data1,data2)
...
s qHandle = $LB("")
q $$$OK
}
3、再搞一个Fetch函数来取每一行的数据,这里要用到一个aHanle来记录一下上次取到哪里了,然后取下一条数据
ClassMethod GetOrderListFetch(ByRef qHandle As %Binary, ByRef Row As %List, ByRef AtEnd As %Integer = 0) As %Status [ Internal, PlaceAfter = GetOrderListExecute ]
{
Set index = $List(qHandle,1)
S index = $O(^||List(index))
If index=""
{
s Row = ""
s AtEnd = 1
}
Else
{
Set Row = ^||List(index)
set AtEnd=0
}
Set qHandle = $LB(index)
Quit $$$OK
}
4、最后是查询结束的Close函数,把缓存Kill掉等
ClassMethod GetOrderListClose(ByRef qHandle As %Binary) As %Status [ Internal, PlaceAfter = GetOrderListExecute ]
{
Set qHandle = ""
Kill ^||List
Quit $$$OK
}
5、在客户端中调用Query是使用一个ResultSet的类来接收结果,以下是c#的代码
Cache cache = new Cache();
if (cache.Connect())
{
ResultSet rs = cache.ResultSet("lab.Cohort", "GetOrderList");
rs.Execute();
while (rs.Next())
{
show.Speification = rs.GetData(1);
show.Pingyin = rs.GetData(2);
}
}
尝试了一下,取288条数据只需要1秒钟,因此推断ResultSet应该是只建立了一次连接,然后数据传输可能也有打包和压缩,传输效率特别高。
最后,还是要吐槽一下,定义一个Query太麻烦了,这,要改!
如无特别说明,本博客文章皆为原创。转载请说明,来自吵吵博客。
原文链接:http://chaochaoblog.com/archives/3973
吵吵微信朋友圈,请付款实名加入: