【问题标题】:perfomance of .ashx handlers for retrieving a lot of binary images用于检索大量二进制图像的 .ashx 处理程序的性能
【发布时间】:2012-10-14 00:38:09
【问题描述】:

我使用 .ashx 处理程序从数据库中获取图像。我想以这种方式检索大量图像 (>1000):

    <img src='GetImage.ashx?id= <%# Eval("id") %>'/>

(为什么我这样做你可以理解,如果阅读我之前的问题:bind database image to ItemTemplate in .ascx)。我担心多重数据库查询(第一个查询获取所有 id,所有其他查询一个一个获取图像)会花费很多时间,是吗?有哪些可能的解决方案?

【问题讨论】:

  • 你有实时试用吗?从您决定使用 ashx 而不是磁盘上的文件的那一刻起,您需要将其移动,先看看时间是否合适,然后再进行优化。浏览器并没有同时询问很多图像,因此可能不会花费“很多”时间。您可以优化稍后在 ashx 上获取图像的方式。
  • 我实时尝试过(我找到了有助于在数据库中插入大量图像的脚本:blog.naver.com/…)。我的最终答案是肯定的。我查询了 1000 张图像(24* 24)和浏览器在2秒内显示它。我认为它很快。但我不明白一件小事:为什么这么快?我不相信即使是简单的查询也需要

标签: asp.net database performance blob httphandler


【解决方案1】:

首先,浏览器并没有一起询问图像,而是一次询问几个。

其次,处理程序不使用会话,因此它不锁定另一个,因此可以为图像调用进行并行处理。

我建议为浏览器添加一个缓存,以便在加载图像时不再询问它。

一个例子:

context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(120));
context.Response.Cache.SetMaxAge(new TimeSpan(0, 120, 0));

但您可以添加更激进的缓存。

一个类似的问题:call aspx page to return an image randomly slow

【讨论】:

  • 你是什么意思“积极缓存”?我必须在其他任何地方兑现处理程序结果并在没有处理程序调用的情况下使用它吗?
  • @AntonPutov 我的意思是放置更多时间,让它永无止境,等等。(图片)
【解决方案2】:

对于经常被要求的静态内容,缓存总是一个好主意。

此外,如果图像相对较小,您可以使用数据 uri 的 http://css-tricks.com/data-uris/

假设您有一个带有 ID INT、名称 VARCHAR(64)、MimeType VARCHAR(64) 和数据 VARBINARY(MAX) 的 Images 表

SELECT Name, 'data:' + MimeType + ';base64,' + cast(N'' as xml).value('xs:base64Binary(xs:hexBinary(sql:column("Data")))', 'VARCHAR(MAX)') AS DataURI

<img src='<%# Eval("DataURI") %>' alt='<%# Eval("Name") %> />

通过这种方式,您可以拥有 1 个将返回所有内容的数据库查询。

【讨论】:

    猜你喜欢
    • 2012-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多