将数据返回到客户端自动完成查询

时间:2010-01-28 15:11:27

标签: asp.net

我正在使用JQuery插件(http://docs.jquery.com/Plugins/Autocomplete)将自动完成添加到“城市”文本字段。该组件调用一个ASP.NET页面,该页面只是加载一个包含所有可能城市值(> 8000)的数组,然后迭代该数组,返回那些以用户到目前为止输入的文本开头的数组。

事实上,它在实际使用中相当慢。它落后于用户键入的程度,大多数时候用户可能不会注意到它在那里。

所以,我的问题是,我怎样才能加快速度呢?

我原本以为数组是一种更好的方法,而不是将数据放入数据库并且必须多次击中。其他人是否同意将这些信息硬编码是一种可行的方式,因为它根本不是挥发性的,而且需要全部关于返回的速度?

如果是这样,你会看到什么来提高性能的速度?我应该在应用程序启动时缓存数据并从内存中访问它吗?我会更好地使用多个数组,每个数组都包含以特定字母开头的值,因此我可以直接转到相关的数组,从而迭代一个小得多的数组?或者我错过了一个更明显的方法来解决这个问题?

提前致谢。

3 个答案:

答案 0 :(得分:1)

如果可以避免,你可能不想硬编码任何数据。将其置于数据库中将使管理更改变得更加容易。并且没有理由每次都必须查询数据库。您可以在自己触摸时将数据从内存中的sql缓存到多个列表中。除非存在某种额外的网络延迟问题,否则应该非常快速。您可能希望发布一些代码,以便人们可以提供更具体的指导。

答案 1 :(得分:1)

您发布的代码看起来很正常,应该快速返回。我的猜测是你使用default "delay" value作为400毫秒的插件。尝试将其更改为低于100毫秒(甚至更低)的东西,看看它是否感觉更好:

$('#textbox').autocomplete('your_url_here', {
   delay: 100
}); 

答案 2 :(得分:0)

感谢您的回复。 (非常基本的)代码如下:

Dim q As String = LCase(Server.UrlDecode(Request.QueryString("q")))
Dim arrCities() As String = {"Abano Terme", "Abbadia Cerreto", ... "Zungri"}
For Each s As String In arrCities
    If s.ToLower.StartsWith(q) Then
        Response.Write(s & vbCrLf)
    End If
Next

第2行基本上是代码中声明正确的巨大数组。它不漂亮,但数据是不可变的,所以我认为我可以逃脱它,我认为它会比直接从数据库中提取它更快。但是,如果你可以提供一些具体的建议,那么SQL可能会有一些缓存吗?