如何在經典的asp場景中最好地緩存已斷開連接的ADODB記錄集應用程序?在ASP Classic中緩存記錄集?
它似乎不可能將斷開的記錄集存儲在應用程序狀態,或者我錯過了什麼?
我發現an example of how you can persist recordsets to xml and load them again,但我希望留在記憶中 - 但它可能是最好的選擇。
如何在經典的asp場景中最好地緩存已斷開連接的ADODB記錄集應用程序?在ASP Classic中緩存記錄集?
它似乎不可能將斷開的記錄集存儲在應用程序狀態,或者我錯過了什麼?
我發現an example of how you can persist recordsets to xml and load them again,但我希望留在記憶中 - 但它可能是最好的選擇。
從技術上講,你可以指定一個斷開ADODB記錄到Application對象。但我不會推薦它。
爲了將對象分配到應用程序對象中,它需要是自由線程的。 ADODB記錄集是單線程,但是它將在分配給應用程序對象時提供自由線程代理。
這意味着什麼時候一個請求需要訪問記錄集,請求運行的當前線程會阻塞,因爲代理會調用最初創建記錄集的線程。如果另一個請求恰好在使用記錄集,則編組呼叫將排隊。
這樣做的問題是實際上記錄集的所有用途都將被序列化,從而產生可伸縮性問題。只有一個請求可以同時訪問記錄集。
但它變得更糟。最初創建記錄集的線程本身可能正在處理一個請求,在這種情況下,不管記錄集是否實際使用,沒有任何內容(除了線程本身)可以訪問記錄集。此外,即使在線程上存在一個現有的記錄集訪問隊列,ASP調度程序仍然可能會向該線程發出請求。
一個解決方案
但是你已經接近了該解決方案。將記錄集的內容轉換爲XML,但不是將其保存到文件中,而是將其加載到FreeThreadedXMLDocument
中。這個對象顧名思義是一個真正自由的線程對象,它不是代理單個線程對象。
現在,您可以將此xml文檔放在應用程序對象中,並可以同時從各種請求中訪問它。
斷開的記錄集本質上已經是一個緩存的記錄集,不是嗎?
[斷開連接的記錄是]已經斷開 從數據源,因此允許 用戶離線工作和記錄之間自由地移動 記錄集。如果創建了具有寫入權限的記錄集 ,那麼 用戶還可以更改和刪除 記錄,或添加新記錄。這些 更改將緩存在本地,而不是 影響主數據庫。稍後一個 連接可以重新建立到 的數據庫,然後可以更新 的更改。
http://www.devguru.com/features/tutorials/DisconnectedRecordsets/tutDisconnRS.asp
是的,但那是重點。:)我想跨多個用戶緩存記錄集*,因此我不必爲每個用戶訪問數據庫並獲取相同的數據(在斷開的記錄集中)。 – Kjensen 2009-11-26 20:18:15
在這種情況下,您需要將斷開連接的記錄集放入全局對象中。看看這篇SO文章,它可能會給出一些線索,說明如何做到這一點:http://stackoverflow.com/questions/1255980/implement-object-caching-in-classic-asp-memory-leaking – 2009-11-26 20:27:19
真棒安東尼,又一次:) – 2009-11-28 17:44:57
很好的答案,但你有任何進一步的信息,你可以在FreeThreadedXMLDocument提供嗎? – 2014-09-25 07:36:38