Databáze – pouze jedno připojení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
woytam
Člen | 14
+
0
-

V případě souběžného běhu více požadavků probíhá pouze jedno připojení do DB, než je celý požadavek ukončen.

Pro odzkoušení jsem použil aplikaci CD-collection z examples z Nette. Provedl jsem úpravu souboru DashboardPresenter.php

34:	public function renderDefault()
35:	{
36:		$this->template->albums = $this->albums->findAll()->order('artist')->order('title');
++		sleep(20);
37:	}

Pokud se pokusím přistoupit na stránku s aplikací (po přihlášení) z prohlížeče (Firefox 17.0.7esr, cache OFF) ve 4 oknech najednou, poslední okno hlásí chybu:

Fatal Error
Maximum execution time of 30 seconds exceeded
File: C:\Vojta\web\nette\DB-test\Nette\Loaders\NetteLoader.php Line: 101

91:         }
92:         return self::$instance;
93:     }
94:
95:
96:     /**
97:      * Handles autoloading of classes or interfaces.
98:      * @param  string
99:      * @return void
100:      */
101:     public function tryLoad($type)
102:     {
103:         $type = ltrim($type, '\\');
104:         if (isset($this->renamed[$type])) {

Problém je v připojení do DB, kdy probíhá pouze jedno připojení. A celých 20 sekund je blokováno, tudíž poslední okno se vůbec nespustí než vyprší limit PHP 30 sekund.
Při paralelním připojení více prohlížečů problém není. Vzhledem k tomu, že skript běží (protože mu vyprší čas) nevidím problém v prohlížeči.

Tušíte někdo, v čem by mohl být problém? Testováno na localhostu i produkčním serveru.

Nette: 2.0.11
PHP: 5.3.8

David Matějka
Moderator | 6445
+
0
-

za to asi nemuze db, ale zamknuty session

Editoval matej21 (23. 7. 2013 22:09)

woytam
Člen | 14
+
0
-

matej21 napsal(a):

za to asi nemuze db, ale zamknuty session

Aha, a dá se s tím něco dělat? Koukám, že Debugger jede celou dobu požadavku.

David Matějka
Moderator | 6445
+
0
-

jo, staci nemit ve scriptu sleep(20); :D

jinak by melo stacit zavolat Nette\Http\Session::close() (v presenteru $this->session->close()) a to uzavre session a odemkne pro dalsi pozadavek