tiny ‘n’ smart
database layer

Odkazy: dibi | API reference

Oznámení

Omlouváme se, provoz fóra byl ukončen

mysql_connect new_link = TRUE

před 6 lety

okovarik
Člen | 2

Zdravím,
na starém projektu používám dibi verzi 1.2.

Začalo se mi stávat, že když aplikaci používá více lidí (nic zásadního, ale s databází se tam pracuje opravdu hodně), tak dostávám error „too many connections“.

Zjištoval jsem proč, když defaultně by mělo být povoleno 151 připojení a spojení by se po ukončení relace měli automaticky uzavřít. (za předpokladu že nepoužívám mysql_pconnect což nepoužívám)
Pak jsem ale našel, že v mysql_connection je 4. parametr $new_link nastaven na TRUE – tzn. že se vytváří nové spojení i když už existuje spojení se stejnými údaji.

Nepřišel jsem na to proč je to TRUE, nepomohlo by mi nastavit to na FALSE?
Tak by teoreticky měl každý uživatel vytvořit pouze jedno spojení.

Díky za rady,
Otto Kovařík

před 6 lety

Milo
Nette Core | 1119

Nové spojení se ale vytvoří pouze při zavolání dalšího dibi::connect(). Když zavoláš dibi::connect() jen jednou během HTTP requestu, budeš mít jen jedno spojení.

před 6 lety

okovarik
Člen | 2

To jsem si taky říkal, ale možná to někde v aplikaci uteklo (je to hodně stará věc) a místo toho aby se ten connect volal jen jednou, tak možná je volán vícekrát. Což si taky určitě projdu a případně opravím, ale tím spíš vlastně nechápu proč tam ten TRUE je.

Přijde mi prostě divný, že aplikaci používá cca 30 lidí (hodně intenzivně ve stejnou dobu) a občas tam skočí too many connections.

Otázka taky je, jaký je na serveru limit, což zrovna zjišťuju.

Nebo může too many connections způsobovat i něco jiného?

před 6 lety

Milo
Nette Core | 1119

Je tam proto, aby se v případě potřeby dalo vytvořit více spojení do databáze. Volání connect() vícekrát je jinak chyba.

Too many connections je prostě moc spojení. Také bych zkontroloval, jestli se spojení uzavírá.

Jak je v té aplikaci Dibi použito? Jestli staticky, tak je dobré dibi::connect() s parametrem lazy => TRUE provést v nějakém centrálním bodě na začátku běhu aplikace, třeba index nebo bootstrap a pak už jen volat dibi::getConnection() kde je potřeba.