17.05.2007, 20:01 | #1 |
Banned
|
Развивающая игра с xRecord.wasCached(), RecordViewCache
Многие опытные разработчики думают о кешировании записей и выполняют соответствующие действия "про запас", не имея времени проверить, работает ли кеш, или не зная, как это можно проверить.
Коллега нашел решение: метод xRecord.wasCached(). Предлагаю всем желающим самостоятельно протестировать и проанализировать следующий код (для 4.0, если это имеет значение): X++: static server void testCaching() // try to call on the client { SalesLine salesLine, salesLineRVC; RecordViewCache rvc; #DEFINE.TestInventTransId('08587_059') void showInfo(str _desc, SalesLine _salesLine) { ; setPrefix(_desc); info(strFmt("InventTransId = '%1', .wasCached() = '%2'.", _salesLine.InventTransId, _salesLine.wasCached())); } ; new Application().flushcompanycache(curExt()); // try to comment this out and start a couple of times Dictionary::dataFlush(salesLine.TableId); // "-" info("All caches have been flushed"); select firstonly salesLine where salesLine.InventTransId == #TestInventTransId; showInfo("1. A select over an indexed field", salesLine); select firstonly salesLine where salesLine.InventTransId == #TestInventTransId; showInfo("2. The same select", salesLine); ttsbegin; select firstonly salesLine where salesLine.InventTransId == #TestInventTransId; showInfo("3. The same select as the 1 and 2, but in TTS", salesLine); ttsabort; select firstonly salesLine where salesLine.InventTransId == #TestInventTransId && salesLine.ConfirmedDlv <= systemDateGet(); showInfo("4. A slightly different select over a non-index field", salesLine); select firstonly salesLine where salesLine.InventTransId == #TestInventTransId && salesLine.ConfirmedDlv <= systemDateGet(); showInfo("5. The same as 4, called the 2nd time", salesLine); select firstonly nofetch salesLineRVC where salesLineRVC.InventTransId == #TestInventTransId; rvc = new RecordViewCache(salesLineRVC); select firstonly salesLine where salesLine.InventTransId == #TestInventTransId && salesLine.ConfirmedDlv <= systemDateGet(); showInfo("6. The same as 4 and 5, but after an RVC has been instantiated", salesLine); } Цитата:
All caches have been flushed
1. A select over an indexed field InventTransId = '08587_059', .wasCached() = 'NotCached'. 2. The same select InventTransId = '08587_059', .wasCached() = 'RecordCached'. 3. The same select as the 1 and 2, but in TTS InventTransId = '08587_059', .wasCached() = 'NotCached'. 4. A slightly different select over a non-index field InventTransId = '08587_059', .wasCached() = 'NotCached'. 5. The same as 4, called the 2nd time InventTransId = '08587_059', .wasCached() = 'NotCached'. 6. The same as 4 and 5, but after an RVC has been instantiated InventTransId = '08587_059', .wasCached() = 'ViewCached'. Последний раз редактировалось EVGL; 17.05.2007 в 20:04. |
|
|
За это сообщение автора поблагодарили: glibs (2), kashperuk (18), Logger (2), Kabardian (2). |
17.05.2007, 21:00 | #2 |
Участник
|
Спасибо
Насколько я могу судить, все совпадает с теоретическими предпосылками.
Но вообще очень ценю желание проверять все подряд. Иначе никак нельзя. Вот только было бы время. Спасибо большое за предоставленный готовый материал для тестов. Кстати, про wasCached недавно вспоминал AndyD в какой-то из тем. |
|
|
За это сообщение автора поблагодарили: EVGL (5). |
12.12.2008, 07:21 | #3 |
Участник
|
Попробовал выполнить на 4-ке - выдал следующее:
All caches have been flushed 1. A select over an indexed field InventTransId = 'Лот746278', .wasCached() = 'NotCached'. 2. The same select InventTransId = 'Лот746278', .wasCached() = 'RecordCached'. 3. The same select as the 1 and 2, but in TTS InventTransId = 'Лот746278', .wasCached() = 'NotCached'. 4. A slightly different select over a non-index field InventTransId = 'Лот746278', .wasCached() = 'NotCached'. 5. The same as 4, called the 2nd time InventTransId = 'Лот746278', .wasCached() = 'NotCached'. Курсор является недопустимым для обработки recordViewCache. 6. The same as 4 and 5, but after an RVC has been instantiated InventTransId = 'Лот746278', .wasCached() = 'NotCached'. Джоб абсолютно тот же - скопировал (изменил только InventTransId). server и nofetch присутствуют. Последний раз редактировалось vanokh; 12.12.2008 в 08:35. |
|
12.12.2008, 09:34 | #4 |
Участник
|
Цитата:
Попробуйте запустить джоб через настроенный менюитем со свойством RunOn = Server Либо сделйте его не джобом, а статическим методом класса и дерните из джоба, тогда гарантировано сработает на сервере. Можно еще первой строкой для контроля места выполнения поставить info(strfMT('Running on %1', isRunningOnServer())); |
|
|
За это сообщение автора поблагодарили: maximka (1), vanokh (1). |
12.12.2008, 10:20 | #5 |
Участник
|
да, так и есть. спасибо!
|
|