吵吵   2020-11-18  阅读:226

用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

吵吵微信朋友圈,请付款实名加入:

吵吵 吵吵

发表评论

电子邮件地址不会被公开。 必填项已用*标注