|
26.10.2022, 16:10 | #1 |
Moderator
|
Опыт показал, что если в классе создать переменную типа 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 | #2 |
Участник
|
Цитата:
Сообщение от fed
Опыт показал, что если в классе создать переменную типа tempDB, положить туда данные, потом FormDataSource прикрепить к этому же инстанцу временной таблицы через myDataSource_ds.cursor().linkPhysicalTableInstance(MyCalculationClass.tempDbBuffer()), а потом вызвать для исходных табличных переменных из MyCalculationClass метод Dispose(), то последствия бывают самые интересные и не вполне предсказуемые. В том числе иногда падает Productive AOS
... В общем - похоже что после linkPhysicalTableInstance() вызывать Dispose для табличных переменных просто нельзя. P.S. D365FO. Но я подозреваю что в DAX2012 грабли аналогичной конструкции. Правда у меня падает не АОС, а клиент и не через некоторое время, а практически сразу при закрытии формы. Но и кейс немного другой, я вызываю 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). |