2009-07-08 51 views
3

我有一个.NET 2.0 Web应用程序,它只被用作客户端应用程序的后端,客户端应用程序将向它发送一个包含1-500KB数据的请求,服务器将对该数据做一些处理,然后查询数据库以构建一组数据以返回客户端 - 从200KB到200MB的任何数据。数据可能需要长达15分钟的时间才能从数据库完全加载,并且长达一小时即可完全传输到客户端(尽管通常时间会比较低 - 20s查询,10s传输)。但是,对于数据库查询和客户端的某些组合,有时数据库速度更快,有时与客户端的链接速度更快。寻找.Net磁盘缓冲流

客户端通过不同质量的链路进行连接 - 一些通过10MB LAN,一些通过共享64kbps ISDN链路。我有四件事情要确保:

  1. 数据库连接必须在尽可能短的时间内保持打开状态。
  2. 必须使用最小的服务器内存。
  3. 数据必须尽快传输到客户端。
  4. 进程的总持续时间应尽可能接近两个进程(DB等待时间,网络传输时间)的最大值,而不是两个进程的时间总和。

到目前为止,我们有三种模式,我们可以在运行代码:

  1. 由于数据是从数据库中取出,将其写入响应流。
  2. 由于数据是从数据库中获取的,请将其保存在内存中。当数据库读取完成时,关闭数据库连接并将数据从内存写入响应流。
  3. 由于数据是从数据库中提取的,因此将其写入临时文件。当从DB读取完成时,关闭DB连接并从临时文件读取并写入响应流。

正如你所想象的,这些完全不符合我们对所有场景的要求。我们已经讨论了基于一些变量来实现一些代码来猜测我们应该使用的三种代码路径中的哪一种,但我认为这里有一个更通用的解决方案,并且我正在寻找一些可以处理这个问题的代码/库为了我们。

我正在寻找的东西是我可以环绕.NET流(输出流),我可以从我们的HttpHandler写入,并且它会处理将数据写入基础流。如果基础流具有太多待处理数据,则它将存储在内存中,并在稍后发送(如果可能)。一旦该内存缓冲区变得太大,它就会作为缓冲区回退到临时文件。当我尝试关闭流时,它会阻塞,直到所有数据写入流中。

你知道这样的代码吗?我可以用它作为起点,或者是一个类似这样的库,或者任何我应该注意的事情的指导。或者,我是否试图完全过度设计这个解决方案?

+0

.NET 3.0/3.5解决方案可能是一个选项 - 如果没有别的,我可以看看他们通知自定义实现的设计。 – 2009-07-08 03:02:15

回答

2

操作系统非常擅长在正确的时间将内存交换到磁盘。为什么不使用常规的缓冲流并让交换空间成为您的文件支持?

+0

根据我的经验,这可能适用于非托管应用程序,但不适用于托管应用程序。从我所看到的,当一个系统受到内存压力的时候,。NET运行了很多GC,这导致页面被重新插入以检查它们引用的内容。同样,这是基于我在类似情况下看到的。也就是说,也许BufferedStream的实现可以解决这个问题 - 我会把它放在选项列表中。 – 2009-07-08 14:39:26