I recently had deadlock issues with c3p0 and statement caching. Long story short, after investigating c3p0 code, I decided to switch to DBCP (maybe I’ll write a post with the long story).

I am not a big fan of Spring (here again, maybe I’ll write a post about that). If you are like me, here is how to programmatically configure Hibernate (JPA) to use DBCP, without Spring and without JNDI.

package com.opcodesolutions.demo;

import java.util.HashMap;
import java.util.Map;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.TypedQuery;

import org.apache.commons.dbcp2.BasicDataSource;
import org.hibernate.cfg.AvailableSettings;

import com.opcodesolutions.generic.jpa.entity.User;

public class HibernateJPAWithDBCP {

    public static void main(String[] args) {

        // Create and configure DBCP DataSource
        BasicDataSource dbcpDataSource = new BasicDataSource();
        dbcpDataSource.setDriverClassName("com.mysql.jdbc.Driver");
        dbcpDataSource.setUrl("jdbc:mysql://localhost:3306/database");
        dbcpDataSource.setUsername("user");
        dbcpDataSource.setPassword("************");

        // Enable statement caching (Optional)
        dbcpDataSource.setPoolPreparedStatements(true);
        dbcpDataSource.setMaxOpenPreparedStatements(50);

        // JPA properties
        Map<String, Object> properties = new HashMap<>();

        // This line will tell hibernate (JPA) to use DBCP
        properties.put(AvailableSettings.DATASOURCE, dbcpDataSource);

        // Create the EntityManagerFactory with JPA properties
        EntityManagerFactory factory =
            Persistence.createEntityManagerFactory("User", properties);

        // Test with simple query
        EntityManager entityManager = factory.createEntityManager();
        TypedQuery<User> query =
            entityManager.createQuery("select u from User u", User.class);
        for (User user : query.getResultList()) {
            System.out.println(user.getFullName());
        }

    }
}

With DBCP, all my deadlock issues disappeared. Thank you ASF.

Author: Jonathan Demers