Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Hibernate/c3p0 connection leak

Tags:

hibernate

c3p0

We're running a spring/hibernate/c3p0 application under load. When I reduce the c3p0 maxPoolSize to some far, far lower than the number of concurrent users, our application just hangs. There are no error messages in the log, but it doesn't proceed forward either.

I expect the application to slow down, but not to stop altogether.

Here is our c3p0 configuration:

<bean id="coreDataSource" 
          class="com.mchange.v2.c3p0.ComboPooledDataSource"
          destroy-method="close"
          p:driverClass="${core.jdbc.driver}"
          p:jdbcUrl="${core.jdbc.url}"
          p:user="${core.jdbc.user}"
          p:acquireIncrement="5"        
          p:acquireRetryAttempts="10"
          p:acquireRetryDelay="5000"
          p:initialPoolSize="52"
          p:maxIdleTime="3600"
          p:maxIdleTimeExcessConnections="300"
          p:minPoolSize="52"
          p:maxPoolSize="125"
          p:numHelperThreads="6"
          p:unreturnedConnectionTimeout="0">
          <property name="password">
              <bean class="com.docfinity.util.encryption.SpringStringDecrypter"
                  p:decryptFlag="${core.jdbc.decryptPasswordFlag}"
                  p:encryptedString="${core.jdbc.password}" />
          </property>
    </bean>

This will lock up if I throw a 160 users at it.

I tried setting unreturnedConnectionTimeout to something positive (120 seconds), and looked at the stack traces that show up in our application. The stack traces are from various different methods in our application. It's not like there's one method we can point to and say that it's leaking connections.

Any help debugging this issue would be most appreciated.

like image 387
Khandelwal Avatar asked May 11 '10 17:05

Khandelwal


People also ask

Which is best connection pool for hibernate?

Hibernate will use its org. hibernate. connection. C3P0ConnectionProvider for connection pooling if you set hibernate.

What is c3p0 Hibernate connection pooling?

C3p0 is an open-source JDBC connection pooling library, with support for caching and reuse of PreparedStatements. Hibernate provides support for Java applications to use c3p0 for connection pooling with additional configuration settings.

Does hibernate use connection pooling?

Providing a connection pool for an application that uses Hibernate is pretty easy, as a matter of fact Hibernate supports a variety of connection pooling mechanisms. If you are using an application server such as WildFly, you may wish to use the built-in pool (typically a connection is obtaining using JNDI).

How does c3p0 connection pool work?

c3p0 is a Java library that provides a convenient way for managing database connections. In short, it achieves this by creating a pool of connections. It also effectively handles the cleanup of Statements and ResultSets after use.


2 Answers

I doubt that Hibernate or Spring are leaking connections, I suspect a configuration problem somewhere that is making your application running our of connections. Here is what I would do:

  • Lower the number of concurrent users and the pool size, I'm not sure the problem is load related.

  • Set unreturnedConnectionTimeout to a value greater than 0 in combination with debugUnreturnedConnectionStackTraces to true to figure out where Connections are being checked-out and not returned to the pool and post some of the generated stacktrace.

  • Identify one business flow (one use case scenario) on which the problem occurs and run your test on this scenario only until you find out the problem.

Also, I'd update the question with one or two stacktraces, maybe someone will spot something obvious.

like image 118
Pascal Thivent Avatar answered Nov 03 '22 22:11

Pascal Thivent


Hibernate and Spring are not the ones leaking connections, somewhere in your app is leaking. I'm not sure about C3P0 but BoneCP (http://jolbox.com) has support to detect unclosed connections (and give you stack traces of where you opened them) + will close off any leaking connections for you when a thread dies off without proper cleanup.

like image 2
wwadge Avatar answered Nov 03 '22 22:11

wwadge