ASP - Кэширование данных
Когда клиенты обращаются к ASP-странице, существует два основных способа обеспечить их требуемой информацией:
- ASP-страница может получить сведения из ресурсов сервера, например из данных, сохраненных в базе данных, или
- ASP-страница может получить сведения внутри приложения.
Извлечение данных из ресурсов вне приложения потребует дополнительных шагов обработки и, следовательно, потребует больше времени, чем генерирование данных внутри пространства приложения.
Если данные, которые должны быть переданы обозревателю, были подготовлены предыдущим запросом, приложение сможет извлечь данные быстрее, если данные хранятся в кэше. Эта форма кэширования называется выходным кэшированием. Выходное кэширование особенно удобно, если ожидается передача одних и тех же данных в том же самом формате для множества разных запросов. Например, одной из задач, часто встречающихся при разработке входной формы, является получение сохраненных данных в виде элементов поля с раскрывающимся списком. Предпочтительно заносить записи непосредственно в страницу HTML, поскольку обновление сохраненных данных будет автоматически отображаться на форме.
Приведенный ниже сценарий представляет пример выходного кэширования. В этом примере функция getSportsListBox создает поле со списком из сохраненных данных. Поле со списком добавляется к пространству приложения, чтобы клиенты могли быстрее получить доступ к нему, чем если бы они заполняли список по индивидуально. В этом примере предполагается, что имя источника данных (DSN) "Sports" определено на сервере.
<%@ LANGUAGE=JavaScript %><HTML><BODY>
<FORM METHOD=post>
What is your favorite sport? <%= getSportsListBox() %>
<P>
<INPUT TYPE=submit>
</FORM>
</BODY>
</HTML>
<%
function getSportsListBox()
{
SportsListBox = Application("SportsListBox")
If (SportsListBox != null) return SportsListBox;
crlf = String.fromCharCode(13, 10)
SportsListBox = "<select name=Sports>" + crlf;
SQL = "SELECT SportName FROM Sports ORDER BY SportName";
cnnSports = Server.CreateObject("ADODB.Connection");
cnnSports.Open("Sports", "WebUser", "WebPassword");
rstSports = cnnSports.Execute(SQL);
fldSportName = rstSports("SportName");
While (!rstSports.EOF)
{ SportsListBox = SportsListBox + " <option>" + fldSportName + "</option>" + crlf; rstSports.MoveNext(); }
SportsListBox = SportsListBox + "</select>"
Application("SportsListBox") = SportsListBox
return SportsListBox;
}
%>
При некоторых обстоятельствах приложение будет получать много различных запросов к одним и тем же данным, но будет необходимо изменять представление данных для каждого запроса. В этом случае используется входное кэширование. С помощью входного кэширования сохраняются данные, но не их представление. Это может быть выполнено кэшированием данных с помощью объекта Dictionary, предоставляемого VBScript, или с помощью набора записей ADO.
Приведенный ниже пример демонстрирует кэширование данных, добавляя набор записей, не требующий подключения, к приложению. ASP-сценарии в пространстве приложения могут затем получить доступ к набозу записей, а не извлекать данные из базы данных. Приведенные ниже два ASP-сценария демонстрируют этот прием.
Выдержка из Global.asa:
<OBJECT ID=rsCustomers PROGID="ADODB.Recordset" RUNAT="Server" SCOPE="Application">
</OBJECT><!--METADATA TYPE="TypeLib" FILE = "C:\Program Files\Common Files\system\ado\msado15.dll"
-->
<% SQL = "SELECT CompanyName, City FROM Customers" Cnn = "DSN=AdvWorks" rsCustomers.CursorLocation = adUseClient rsCustomers.Open SQL, Cnn, adOpenStatic, AdLockReadOnly rsCustomers.ActiveConnection = Nothing
Set myCustomers = Application("rsCustomers").Clone Set CompanyName = myCustomers("CompanyName") Set City = myCustomers("City")
Do Until myCustomers.EOF%><B><%= CompanyName %></B> is located in <B><%= City %></B>.<P>
<%
myCustomers.MoveNext
Loop
%>
Файл Global.asa приложения создает набор записей и добавляет его к пространству приложения. ASP-сценарий затем заполняет набор записей, делает его не требующим подключения, установив свойство ActiveConnection в Nothing. Затем ASP-сценарий размножает это набор записей и перебирает его значения, что происходит быстрее доступа к базе данных. Этот прием применим, если известно, что данные, которыми будет наполняться набор записей, относительно постоянны.