在经典的ASP方案中,如何最好地在整个应用程序范围内缓存断开连接的ADODB记录集?
似乎无法在应用程序状态下存储断开连接的记录集,还是我丢失了某些东西?
我找到了an example of how you can persist recordsets to xml and load them again,但我希望留在内存中-但这可能是最好的选择。
最佳答案
从技术上讲,您可以将断开连接的ADODB记录集分配给Application对象。但是我不推荐它。
为了将一个对象分配给应用程序对象,它需要是自由线程的。 ADODB记录集是单线程的,但是当分配给应用程序对象时,它将提供一个自由线程的代理。
这意味着当请求需要访问记录集时,正在运行请求的当前线程将被阻塞,因为代理将把对记录集最初创建位置的线程的调用编组。如果另一个请求正巧在使用记录集,则将对编组的调用进行排队。
这样做的问题是,实际上记录集的所有使用都将被序列化,从而造成可伸缩性问题。只有一个请求可以同时访问记录集。
但情况变得更糟。最初创建记录集的线程本身可能正在处理请求,在这种情况下,无论是否实际使用记录集,任何东西(线程本身除外)都无法访问记录集。此外,即使线程上存在记录集访问队列,ASP调度程序仍可能向线程发出请求。
一个办法
但是,您已经接近解决方案。将记录集的内容转换为XML,而不是将其保存到文件中,而是将其加载到FreeThreadedXMLDocument
中。顾名思义,该对象是真正的自由线程对象,而不是单个线程对象的代理。
现在,您可以将此xml文档放置在应用程序对象中,并同时从各种请求中访问它。