Apache commons GenericObjectPool

In einem Spring MVC Projekt habe ich den GenericObjectPool von Apache commons eingebaut. Dieser hat einige Monate scheinbar getan, was er sollte, bis das Projekt Zugriffszahlen erreicht hat, die ein gewisses Limit überschritten haben. Seit dem ist der Server, ein Jetty, regelmäßig mit Heapspace exhausted abgeschmiert.

Nach einer Analyse des Heapdumps ergab sich, dass der Server nach 2 Stunden Laufzeit ca. 600.000 Objekte des GenericObjectPool Objekts im Speicher hielt und diese nicht abbaute, die destroy-Methode also nicht funktionierte. commons-dbcp als Maven-dependency kommt als aktuelle stable-version in der Version 1.4. Diese Library beinhaltet aber leider commons-pool in der Version 1.5.4, welche noch den in der Version 1.5 hinzugefügten Bug beinhaltet, dass die Factory Methoden aus dem syncronized scope herausgenommen wurden, um Deadlogs entgegen zu wirken. Leider hat dies auch zur Folge gehabt, dass die Connections nicht mehr korrekt abgebaut wurden. Dieser Bug wurde in der commons-pool version 1.5.5 behoben, jedoch beinhaltet die stable version von commons-dbcp diese leider nicht.

Das Problem kann also dorch folgenden Kniff behoben werden:

<dependency>
    <groupId>commons-dbcp</groupId>
    <artifactId>commons-dbcp</artifactId>
    <version>1.4</version>
    <exclusions>
    <!-- Exclude Commons Pool 1.5.4 because using a newer version -->
        <exclusion>
            <groupId>commons-pool</groupId>
            <artifactId>commons-pool</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 
 <dependency>
    <groupId>commons-pool</groupId>
    <artifactId>commons-pool</artifactId>
    <version>1.6</version>
</dependency>

Einfach die Version 1.5.4 von commons-pool excludieren und commons-pool in der aktuell neuesten stable Version 1.6 als Dependency einbinden. Dies behebt das Problem mit den ungeschlossenen connections.

Print Friendly

Leave a Reply

Your email address will not be published. Required fields are marked *