Шаг 94 - Свойство CacheSize

Описание
Задает или возвращает число записей, загруженных из источника данных ODBC, которых следует поместить в локальный буфер.

Значение
Задаваемое или возвращаемое значение имеет тип данных Long и должно находиться в пределах от 5 до 1200, но не превышать объем доступной памяти. Типичным значением данного свойства является число 100. Значение 0 отключает буфер.

Замечания
Помещение данных в локальный буфер повышает быстродействие при использовании объектов Recordset для загрузки данных с удаленного сервера. Буфером называется область локальной памяти, содержащая данные, которые были получены с сервера во время последних обращений. Данные заносятся в локальный буфер в предположении, что во время выполнения приложения потребуется повторное обращение к этим данным. Во время обращения к данным ядро базы данных Microsoft Jet сначала проверяет наличие данных в локальном буфере вместо обращения к серверу, которое занимает намного больше времени. В локальном буфере сохраняются только данные, поступающие из источника данных ODBC.
Любой источник данных ODBC, подключенный к ядру Microsoft Jet, такой как присоединенная таблица, может иметь собственный локальный буфер. Для создания локального буфера следует открыть объект Recordset на основе удаленного источника данных, задать значения свойств CacheSize и CacheStart, а затем вызвать метод FillCache или осуществить переходы по записям с помощью методов группы Move.
Для источника данных ODBCDirect также поддерживается использование локального буфера. Для создания буфера следует определить свойство CacheSize объекта QueryDef. Для объекта Relation свойство CacheSize доступно только для чтения и определяется значением свойства CacheSize объекта QueryDef. В рабочей области ODBCDirect невозможно использовать свойство CacheStart в методе FillCache.
Выбор значения свойства CacheSize основывается на числе записей, с которыми приложение может работать одновременно. Например, если объект Recordset используется как источник данных для вывода на экран, удобно задать для свойства CacheSize значение 20 для сохранения в буфере 20 одновременно выводимых на экран записей.
Записи, которые помещены в локальный буфер, принимаются ядром базы данных Microsoft Jet непосредственно из буфера, а записи вне этого диапазона загружаются с сервера.
Записи, полученные из локального буфера, не отражают изменений, внесенных в источник данных другими пользователями со времени записи данных в буфер.
Для принудительного обновления содержимого локального буфера следует задать значение 0 для свойства CacheSize объекта Recordset, а затем восстановить первоначальное значение размера буфера и вызвать метод FillCache.

Пример
В данном примере методы CreateTableDef и FillCache и свойства CacheSize, CacheStart и SourceTableName используются, чтобы дважды перебрать все записи в присоединенной таблице, первый раз без временного буфера и второй с временным буфером на 50 записей. Далее выводятся статистические данные о выполнении этой операции с временным буфером и без него.

Sub ClientServerX3()

	Dim dbsCurrent As Database
	Dim tdfRoyalties As TableDef
	Dim rstRemote As Recordset
	Dim sngStart As Single
	Dim sngEnd As Single
	Dim sngNoCache As Single
	Dim sngCache As Single
	Dim intLoop As Integer
	Dim strTemp As String
	Dim intRecords As Integer

	' Открывает базу данных, в которую будет добавлена
	' присоединенная таблица.
	Set dbsCurrent = OpenDatabase("DB1.mdb")
	' Создает таблицу, присоединенную к базе данных
	' Microsoft SQL Server.
	Set tdfRoyalties = dbsCurrent.CreateTableDef("Отчисления")
	tdfRoyalties.Connect = "ODBC;DATABASE=pubs;UID=sa;PWD=;DSN=Publishers"
	tdfRoyalties.SourceTableName = "roysched"
	dbsCurrent.TableDefs.Append tdfRoyalties
	Set rstRemote = dbsCurrent.OpenRecordset("Отчисления")
	With rstRemote
		' Дважды перебирает записи в объекте Recordset
		' и определяет затраченное время.
		sngStart = Timer

		For intLoop = 1 To 2
			.MoveFirst
			Do While Not .EOF
				' Выполняет простую операцию 
				' для проверки быстродействия.
				strTemp = !title_id
				.MoveNext
			Loop
		Next intLoop

		sngEnd = Timer
		sngNoCache = sngEnd - sngStart

		' Помещает в буфер первые 50 записей.
		.MoveFirst
		.CacheSize = 50
		.FillCache
		sngStart = Timer

		' Дважды перебирает записи в объекте Recordset
		' и определяет затраченное время.

		For intLoop = 1 To 2
			intRecords = 0
			.MoveFirst
			Do While Not .EOF
				' Выполняет простую операцию 
				' для проверки быстродействия.
				strTemp = !title_id
				' Подсчитывает записи. Если достигнут конец
				' буфера, то в буфер помещаются
				' следующие 50 записей.
				intRecords = intRecords + 1
				.MoveNext
				If intRecords Mod 50 = 0 Then
					.CacheStart = .Bookmark
					.FillCache

			End If
			Loop
		Next intLoop

		sngEnd = Timer
		sngCache = sngEnd - sngStart

		' Выводит результаты.
		MsgBox "Сравнение результатов:" & vbCr & "    Без буфера: " & Format(sngNoCache, _
			"##0.000") & " секунд" & vbCr & "    С буфером на 50 записей: " & Format(sngCache, _
			"##0.000") & " секунд"
		.Close
	End With

	' Удаляет присоединенную таблицу, созданную для демонстрации.
	dbsCurrent.TableDefs.Delete tdfRoyalties.Name

	dbsCurrent.Close
End Sub

Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем - 17.03.2002