AXForum  
Вернуться   AXForum > Microsoft Dynamics AX > DAX: Программирование
DAX
Забыли пароль?
Зарегистрироваться Правила Справка Пользователи Сообщения за день Поиск

 
 
Опции темы Поиск в этой теме Опции просмотра
Старый 11.07.2022, 13:28   #1  
mazzy is offline
mazzy
Участник
Аватар для mazzy
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
29,472 / 4494 (208) ++++++++++
Регистрация: 29.11.2001
Адрес: Москва
Записей в блоге: 10
Цитата:
Сообщение от Logger Посмотреть сообщение
Где правильнее всего разместить этот вызов ?
Напрашивается
\Classes\Application\closingDown
при падении Аксапты кэш не будет очищен.

"некий кеш" лучше организовывать при помощи стандартного кэш сервера. например Redis.
В том же Redis есть автопротухание данных.

тогда и несколько инстансев аксапты будут нормально работать.
и другие неаксаптовские подсистемы спасибо скажут.
и эцилопп не имеет права бить по ночам. никогда.
__________________
полезное на axForum, github, vk, coub.
Старый 11.07.2022, 13:36   #2  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от mazzy Посмотреть сообщение
при падении Аксапты кэш не будет очищен.
Это да.
Но я и не надеялся такое вылечить. Не все под силу.
Там много г. во временной базе остается при падении аоса.

Это у меня не совсем кеш. Я не совсем корректный термин употребил. В общем времянка хранит некие данные актуальные только для конкретного юзера. Т.е. у каждого юзера свое наполнение.

Соответственно вопрос, с учетом багов ядра по освобождению времянок, куда корректно было бы поместить вызов dispose() для времянки.

Может кто делал и проверял как работает.
Интересно также CIL сессии и те, что создаются по RunAs. Для них ядро вызывает closingDown ?

Хотелось остаться внутри аксапты и не привлекать сторонние инструменты (Redis, etc)
Старый 11.07.2022, 13:53   #3  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Мне кажется что проблема зависших времянок в tempDb не так страшна. Когда AOS будет останавливаться, времянки удалятся.
Проблема с времянками в том, что если ты их в цикле создаешь, а потом через dispose() не освобождаешь, то кэш плана запроса забивается тысячам одинаковых запросов, у которых только имя временной таблицы отличается. В твоем случае гарантируется что всего один инстанц времянки на пользователя будет и даже если пользователь из системы выйдет, а времянка не удалится, то новых запросов в кэше по ней появлятся не будет. То есть - я бы с этой проблемой просто не стал бы бороться.
Старый 11.07.2022, 14:30   #4  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Да, циклов там не будет.
Согласен, что несущественная проблема.
Просто все мы стремимся к идеалу, хоть чуть-чуть.

Вот и возникает вопрос.
А как бы правильно ...
Старый 26.10.2022, 16:10   #5  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Опыт показал, что если в классе создать переменную типа tempDB, положить туда данные, потом FormDataSource прикрепить к этому же инстанцу временной таблицы через myDataSource_ds.cursor().linkPhysicalTableInstance(MyCalculationClass.tempDbBuffer()), а потом вызвать для исходных табличных переменных из MyCalculationClass метод Dispose(), то последствия бывают самые интересные и не вполне предсказуемые. В том числе иногда падает Productive AOS
Я так понимаю, когда форма закрывается, переменные с датасорцами не освобождаются немедленно, а ждут сборки мусора. Потом в какой-то момент времени сборщик мусора просыпается, пытается удалить датасорцы и прикрепленные к ним табличные переменные, а там опаньки - табличные переменные-то уже кто-то удалил. В итоге сервер с заметной вероятностью падает.
В общем - похоже что после linkPhysicalTableInstance() вызывать Dispose для табличных переменных просто нельзя.
P.S. D365FO. Но я подозреваю что в DAX2012 грабли аналогичной конструкции.
За это сообщение автора поблагодарили: sukhanchik (6), Logger (5).
Старый 27.10.2022, 08:45   #6  
Raven Melancholic is offline
Raven Melancholic
Участник
Аватар для Raven Melancholic
Самостоятельные клиенты AX
Лучший по профессии 2015
 
2,160 / 1289 (47) ++++++++
Регистрация: 21.03.2005
Адрес: Москва-Петушки
Цитата:
Сообщение от fed Посмотреть сообщение
Опыт показал, что если в классе создать переменную типа tempDB, положить туда данные, потом FormDataSource прикрепить к этому же инстанцу временной таблицы через myDataSource_ds.cursor().linkPhysicalTableInstance(MyCalculationClass.tempDbBuffer()), а потом вызвать для исходных табличных переменных из MyCalculationClass метод Dispose(), то последствия бывают самые интересные и не вполне предсказуемые. В том числе иногда падает Productive AOS
...
В общем - похоже что после linkPhysicalTableInstance() вызывать Dispose для табличных переменных просто нельзя.
P.S. D365FO. Но я подозреваю что в DAX2012 грабли аналогичной конструкции.
Да, совсем недавно на 2012 с этим столкнулся.
Правда у меня падает не АОС, а клиент и не через некоторое время, а практически сразу при закрытии формы.

Но и кейс немного другой, я вызываю linkPhysicalTableInstance не на датасорсе, а наоборот, передаю курсор датасорса и его прикрепляю к локальной переменной:
X++:
public void inventToShipPrepare(
    ShipmentJournalRequestMap_OVK   _journalRequest,
    ShipmentInventToShipMap_OVK     _inventToShip
    )
{
    ShipmentInventToShipMap_OVK         inventToShip;
    ;
    
    inventToShip        = _inventToShip.emptyRecord();
    if (_inventToShip.isTempDb())
    {
        inventToShip.linkPhysicalTableInstance(_inventToShip);
    }

...

    // TODO: AKlim 12.10.2022 Попробовать разобраться в причине падения клиента
    //       Пока освобождение закомментировано, так как падает клиент при закрытии формы
    /*    
    if (_inventToShip.isTempDb())
    {
        inventToShip.dispose();
    }
    */
}
За это сообщение автора поблагодарили: Logger (5).
Старый 27.10.2022, 12:18   #7  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Крайне неприятный баг.
Использованные вами методы работают со ссылкой на переменную. Возможно из-за этого дополнительные зависимости появляются и поэтому падает.

А если задействовать методы ?
getPhysicalTableName
useExistingTempDBTable

Там просто реальное SQL имя таблички передается.
Возможно не будет падать.
Я в своей модификации использовал их - не падало. Правда сценарий был немного другой.

Последний раз редактировалось Logger; 27.10.2022 в 12:23.
Старый 27.10.2022, 12:58   #8  
fed is offline
fed
Moderator
Аватар для fed
Ex AND Project
Соотечественники
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии AXAWARD 2013
Лучший по профессии 2011
Лучший по профессии 2009
 
2,895 / 5650 (194) ++++++++++
Регистрация: 13.03.2002
Адрес: Hüfingen,DE
Цитата:
Сообщение от Logger Посмотреть сообщение
Крайне неприятный баг.
...
А если задействовать методы ?
getPhysicalTableName
useExistingTempDBTable
Я на эту тему думал, но мы решили, что это все равно настроечная форма, которой в месяц раз пять пользуются. Соответственно - пять мусорных временных табличек в месяц - это дешевле чем эксперименты, которые иногда сервер роняют. (При этом о том, что AOS от этой функциональности иногда падает, мы знали с февраля примерно, но комбинацию данных, при которой это железно происходит - выловили только неделю назад).

Последний раз редактировалось fed; 27.10.2022 в 14:18.
Старый 28.11.2023, 16:07   #9  
bio_unit is offline
bio_unit
Участник
Аватар для bio_unit
Сотрудники компании GMCS
Ex AND Project
 
119 / 77 (3) ++++
Регистрация: 21.04.2004
То, что сервер роняет - это еще ничего...
Мы столкнулись на D365, что при неумелом использовании dispose и передаче tempDb таблиц через простое присваивание переменных, может быть эффект удаления данных из реальных таблиц БД.

delete_from tmpSomeTable;

Видимо, когда сборщик мусора отрабатывает, то tmpSomeTable может ссылать на какой-то произвольный курсор, какой-то случайной таблицы и delete_from отрабатывает по какой-то произвольной физической таблице БД.
Например, в одном случае - CustParameters, в другом - InventTable.
Из таблиц БД начинают "загадочно" пропадать данные.
За это сообщение автора поблагодарили: Logger (5).
Старый 11.12.2023, 12:06   #10  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,882 / 3148 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от bio_unit Посмотреть сообщение
То, что сервер роняет - это еще ничего...
Мы столкнулись на D365, что при неумелом использовании dispose и передаче tempDb таблиц через простое присваивание переменных, может быть эффект удаления данных из реальных таблиц БД.
А как лечили ?

Убирали
X++:
delete_from tmpSomeTable;
Отказались от dispose ?
Теги
dispose, tempdb

 

Похожие темы
Тема Автор Раздел Ответов Посл. сообщение
TempDB table populated in CIL Blog bot DAX Blogs 9 05.03.2019 18:23
Axilicious:Permission denied in database ‘TempDB’ Blog bot DAX Blogs 0 27.01.2015 18:11
axinthefield: TempDb blocking with Dynamics AX Blog bot DAX Blogs 0 13.06.2011 00:11
Работа с таблицами Bigzone DAX: Программирование 7 25.10.2006 13:24
Помогите новичку (Работа с таблицами) Sada DAX: Программирование 4 03.06.2005 10:13

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход

Рейтинг@Mail.ru
Часовой пояс GMT +3, время: 17:20.
Powered by vBulletin® v3.8.5. Перевод: zCarot
Контактная информация, Реклама.