sql >> Databáze >  >> RDS >> Mysql

c3p0 maxIdleTime je stejný jako wait_timeout mysql?

Nejprve se podívejme na vlastnosti mysql.

  • interactive_timeout :Interaktivní časový limit pro mysql shell sessions během několika sekund, jako jsou nástroje příkazového řádku mysqldump nebo mysql. připojení jsou ve stavu spánku. Většinou je toto nastaveno na vyšší hodnotu, protože nechcete, aby se odpojilo, když něco děláte na mysql cli.
  • wait_timeout :množství sekund během nečinnosti, po které bude MySQL čekat, než uzavře připojení na neinteraktivním připojení v sekundách. příklad:připojeno z java. připojení jsou ve stavu spánku.

Nyní pojďme pochopit vlastnosti c3po a jejich vztah k DB props. (Jen zkopíruji z vaší otázky)

To se týká toho, jak dlouho může být objekt připojení použitelný a bude dostupný ve fondu. Jakmile vyprší časový limit, c3po jej zničí nebo recykluje.

Nyní problém nastává, když máte maxIdleTime vyšší než wait_timeout .řekněme, že mxIdleTime : 50 s a wait_timeout : 40 s pak je tu možnost, že dostanete Connection time out exception: Broken Pipe pokud se během posledních 10 sekund pokusíte provést jakoukoli operaci. Takže maxIdelTime by měla být vždy menší než wait_timeout .

Místo maxIdleTime můžete mít následující vlastnosti.

  • idleConnectionTestPeriod nastavuje limit, jak dlouho připojení zůstane nečinné, než jej otestujete. Bez preferredTestQuery , výchozí je DatabaseMetaData.getTables() - což je databáze agnostika, ai když je to poměrně drahé volání, je pravděpodobně vhodné pro relativně malou databázi. Pokud jste paranoidní ohledně výkonu, použijte dotaz specifický pro vaši databázi (i.e. preferredTestQuery="SELECT 1")
  • maxIdleTimeExcessConnections po nárůstu aktivity vrátí connectionCount zpět na minPoolSize.

Vezměte prosím na vědomí, že jakákoli vlastnost fondu (např. maxIdleTime ) má vliv pouze na připojení, která jsou ve fondu tj. pokud hibernace získala připojení a udržuje je nečinné po dobu maxIdleTime a poté se pokusí provést jakoukoli operaci, zobrazí se "Broken Pipe"

Je dobré mít nižší wait_timeout na mysql, ale není to vždy správné, když máte aplikaci již postavenou. Než ji zmenšíte, musíte se ujistit, že ve své aplikaci nenecháváte připojení otevřené déle než wait_time ven.

Musíte také vzít v úvahu, že získání připojení je nákladný úkol, a pokud je čekací doba příliš krátká, pak to překonává celý účel fondu připojení, protože se bude často pokoušet získat připojení.

To je zvláště důležité, když neprovádíte správu připojení ručně, například když používáte Spring nadnárodní API. Spring zahájí transakci, když zadáte @Transaction anotovanou metodou, takže získá připojení z fondu. Pokud voláte nějakou webovou službu nebo čtete nějaký soubor, což zabere více času než wait_time out, dostanete výjimku.

S tímto problémem jsem jednou čelil.

V jednom ze svých projektů jsem měl cron, který dělal zpracování objednávek pro zákazníky. Aby to bylo rychlejší, použil jsem dávkové zpracování. Nyní, jakmile získám dávku zákazníků a provedu nějaké zpracování (žádná volání db). Když se snažím uložit všechny objednávky, dostal jsem výjimku z rozbitého potrubí. Problém byl v tom, že můj wait_timeout byl 1 minuta a zpracování objednávky trvalo déle. Takže jsme to museli zvýšit na 2 minuty. Mohl jsem zmenšit velikost dávky, ale to zpomalovalo celkové zpracování.



  1. Jak funguje funkce RIGHT() v MySQL

  2. Existuje nějaký důvod k obavám z pořadí sloupců v tabulce?

  3. Složitost NULL – Část 3, Chybějící standardní funkce a alternativy T-SQL

  4. SQL Server Aktivační událost pro práci s vkládáním více řádků