Hi people,

I get memory leaks from the built-in TomEE JDBC connection pool,
using the default container-managed persistence and transactions.

I have some code in a Singleton EJB that does, essentially, this:

    @PersistenceUnit(unitName = "MyApp")
    EntityManagerFactory emf;

    @Schedule(second="*/10", minute="*", hour="*")
    public void tickTock() {
        EntityManager em = emf.createEntityManager();
        em.find(MyTrivialEntity.class, 1);
    }

Every time tickTock() is invoked, jmap -histo:live reports objects
being added permanently to the heap:

 num     #instances         #bytes  class name
----------------------------------------------
[...]
 270:             6           1584  com.mysql.jdbc.JDBC4PreparedStatement
 322:             6           1056  com.mysql.jdbc.JDBC4ResultSet

These #instances and #bytes values increase at a steady pace,
and if I leave it running long enough this causes OutOfMemory.
The number of connections doesn't grow: both mysqladmin and jmap
consistently report 3 simultaneous connections all the time.

It doesn't matter if I use Eclipselink instead of OpenJPA.

But the memory leak goes away if I change the database from Mysql
to embedded Derby, so I assume there is some quirkiness in the
Mysql driver that is involved.

The memory leak also goes away if I revert to using commons-dbcp
for the pool.

MaxAge <N> is a workaround, but how do I choose <N> for any
specific load? This is not an attractive solution.

I searched a lot before I posted this, and I found recommendations
that you should always close SQL Statements and ResultSets before
returning connections to the pool. But I have to trust the container
to do this when I am using JPA, right? Or am I missing something?

Version info:

apache-tomee-1.5.1-plus (I also tried today's 1.5.2 snapshot)
mysql-connector-java-5.1.22
jdk-7u9

-- 
Bjorn Danielsson
Cuspy Code AB

Reply via email to