Commons DBCP industriální standard s chybami

V rámci zátěžových testů, které jsem v minulém týdnu prováděl, jsem přišel na jednu zajímavou věc. Při velké zátěži došlo k “zaseknutí” Tomcatu, ze kterého se systém již nedokázal zotavit. Průvodním jevem byly otevřené konekce na databázi, přes které neprocházely žádné dotazy (tj. databáze nic nedělala), nulové zatížení procesoru Tomcatem, žádné Exception v logu. Příznaky nasvědčovaly tomu, že problém vězel v nějakých deadloccích – buď při práci s konekcemi do databáze nebo mezi aplikačními vlákny.

Po nějaké době nikam nevedoucího pátrání v našem kódu jsem si napsal jednoduché wrappery nad DBCP DataSourcem a vracenou Connection, ve kterých jsem si ukládal stacktrace threadu i odkaz na vlastní thread, který si konekci z DataSourcu vybíral. Dál jsem zavedl monitor toho, zda thready používají vždy pouze jedinou connection a nesnaží se zíkat další, pokud ještě tu původní nevrátily (to by mohla být cesta k deadlockům).

Při opětovném nasimulování problému mi monitor vypsal krásných 50 (tj. maximum poolu) vláken čekajících na uvolnění zámku s nasledujícím stacktracem (uvádím pouze pár nejdůležitějších řádků):

at org.apache.commons.pool.impl.GenericKeyedObjectPool.returnObject (GenericKeyedObjectPool.java:870)
at org.apache.commons.dbcp.datasources.KeyedCPDSConnectionFactory.connectionClosed (KeyedCPDSConnectionFactory.java:268)
at com.mysql.jdbc.jdbc2.optional.MysqlPooledConnection.callListener (MysqlPooledConnection.java:209)
at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.close (ConnectionWrapper.java:857)
at com.mysql.jdbc.jdbc2.optional.ConnectionWrapper.close (ConnectionWrapper.java:480)

Přečtěte si zbytek tohoto záznamu »

Diskuzní příspěvky
Zatím zde nejsou žádné zprávy