Nette 2.4 – změna v cachování NDB?
- kolsi
- Člen | 131
Chtěl bych se jenom zeptat, změnilo se v Nette 2.4 něco ohledně cachování oproti předchozímu Nette 2.3 ?
Mám ten problém, že po přechodu na 2.4 se to chová naprosto nepředvídatelně. Např. tento jednoduchý kód:
$project = $this->projectRepository->findById($id);
Debugger::barDump($project->label);
Po upgradu na Nette 2.4 to hlásí, že nezná sloupec „label“. Když vypíšu proměnnou $column (tj. ActiveRow), tak z celkovým 10 sloupců obsahuje jenom 3. Smažu cache a funguje to. Pak ale na jiné stránce přistupuju k jinému sloupci a začne to zase hlásit, že nezná ten jiný sloupec. Smažu cache a funguje, ale zase přestane fungovat to původní.
- Gappa
- Nette Blogger | 208
To mi připomíná tohle:
Na jednom projektu se mi to chová podobně – nějakou dobu to vždy funguje, pak se to „samo rozbije“, smažu cache, nechám přegenerovat a zase to funguje.
Co s tím, tak to bohužel zatím nevím.
- kolsi
- Člen | 131
Tam koukám, že tazatel má Nette 2.2. Mně to začlo dělat až s přechodem na Nette 2.4 a dělá to poměrně často.
Nějak víc jsem to zatím nedebuggoval, ale přijde mi, že když načtu nějakou stránku, která přistupuje k některým sloupcům v tabulce, tak se tyto sloupce nacachují. Pak když otevřu jinou stránku, která přistupuje k jiným sloupcům, tak už to kouká jenom do cache a zahlásí chybu, že ten sloupec nezná.
- Pavel Kravčík
- Člen | 1196
Tohle nepomůže? https://github.com/…ase/pull/137
Jinak stávalo se mi to taky, když jsem pro podobný dotaz vybíral explicitně sloupce a jiné pak nechtěl, už si to přesně nepamatuji, ale na jednom projektu pomohl tento fix a na další úprava SQL v ORM.
- Pavel Kravčík
- Člen | 1196
kolsi napsal(a):
Tak po několika dnech používání Nette 2.4 musím konstatovat, že je absolutně nepoužitelné.
U nás naopak, všechny projekty, které jsme migrovaly na 2.4 fungují jako po másle. :)
Zkus ještě mrknout do composeru, jestli požaduješ nejnovější cache realese (2.5), třeba pomůže. https://github.com/…ing/releases
- kolsi
- Člen | 131
Reprodukovat jo, ale absolutně to nechápu. Nejjednodušší případ, kdy se mi to podařilo vyprodukovat je následující. Udělal jsem úplně prázdný presenter (zděděný od Nette\Application\UI\Presenter) s metodou actionDefault.
/** @var ProjectRepository @inject */
public $projectRepository;
public function actionDefault() {
$project = $this->projectRepository->findById(1); // volá get() nad příslušnou tabulkou
echo $project->label;
}
Smažu složku temp\cache a načtu stránku, vše je ok. Vypíše se správný výsledek. Následně doplním testovací výpis:
public function actionDefault() {
$project = $this->projectRepository->findById(1);
echo $project->label;
Tracy\Debugger::barDump($project);
}
Refreshnu stránku a dostanu jenom error „Cannot read an undeclared column
‚label‘“.
Odebrání přidaného barDump nepomůže. Pokud znovu smažu temp\cache a
refreshnu stránku, tak to už funguje.
Pokud po chybě dám ten barDump před „echo…“, tak v dumpu vidím jenom sloupce id+name (label tam není).
- Pavel Kravčík
- Člen | 1196
Hoď někam github sandbox s replikací. Pak se na to může někdo podívat. Největší šance na chybu je v tvém repositáři hádám.
- kolsi
- Člen | 131
Tak chyba může být samozřejmě kdekoli, to nevylučuju. Jediné, co mohu na 100% potvrdit je, že v Nette 2.3 se to nestalo ani jednou a po upgradu na Nette 2.4 ten úplně stejný kód hází náhodně tuto chybu tak 20× denně.
Pokud se problém snažím vyvolat uměle, tak většinou neuspěju, ale
jakmile pracuju, tak to dělá každou chvíli.
Náš konkrétní kód bohužel zveřejnit nemohu.
- kolsi
- Člen | 131
findById() nedělá nic speciálního než $this->getTable()->get($id) a getTable() jenom $this->connection->table(‚tabulka‘);
Zatím to vypadá, že k vyvolání problému vede konkrétní kombinace akcí (resp. po sobě jdoucích dotazů do stejné tabulky). V debuggování budu pokračovat v pondělí, tak kdyby byl nějaký nápad, co mám sledovat, tak zkusím.
- kolsi
- Člen | 131
Může samovolně docházet k vymazání cache i v průběhu?
Normální situace – pokud smažu cache ručně, tak při prvním obnovení stránky se provádí dotazy jako „SHOW FULL TABLES“, „SHOW FULL COLUMNS“ atd. Při dalším načtení stránky se už tyto dotazy neprovádí.
V době, kdy ale nastane zmiňovaná chyba, je v Tracy zalogováno pár normálních dotazů, a pak se najednou volá „SHOW FULL TABLES“ atd. jako při obnově cache. Následně to spadne v ActiveRow.php, ř. 299, že neexistuje sloupec. A vypadá to, že v ActiveRow::$data jsou v tu chvíli uloženy pouze sloupce, které byly načteny před tím samovolným refreschnutím cache.
V tuto chvíli se problém vyskytuje na řádku
return $position->edit_allowed;
, kde ho dokážu vyvolat
pokaždé. Je zvláštní, že SQL dotaz volaný z toho řádku je pouze:
SELECT `id` FROM `organization_position` WHERE (`organization_position`.`id` = 23)
Jeho výsledek tak obsahuje pouze sloupec „id“, ale už nikoli edit_allowed. To vyvolá refreshnutí cache a následnou výjimku „column not found“
Editoval kolsi (3. 4. 2017 12:12)