保持JPA EntityManager打开 - 连接池

时间:2015-09-14 17:42:01

标签: spring hibernate jpa spring-data connection-pooling

在我们开发的一个RESTful Web服务(Spring MVC - Rest)中,我们对DB进行了大约50次调用。这需要大约一分钟才能完成。我们可以看到,每次调用后,JPA实体管理器都会关闭,并根据下面的日志创建一个新的实体管理器

DEBUG o.s.o.jpa.EntityManagerFactoryUtils - Closing JPA EntityManager
17:18:16.399 [http-bio-8080-exec-5] DEBUG o.s.o.j.SharedEntityManagerCreator$SharedEntityManagerInvocationHandler - Creating new EntityManager for shared EntityManager invocation

我们怀疑这需要时间,因为查询在自己执行时花费的时间最少。我们如何确保JPA连接始终保持开放?请注意,这是一个GET电话,我们没有做任何更新。我们如何实现连接池? JPA连接的关闭\开放是否很昂贵?

这是我们以编程方式(ApplicationConfiguration)

声明EntityManager的地方
    LocalContainerEntityManagerFactoryBean entityManagerFactory = new LocalContainerEntityManagerFactoryBean();
    entityManagerFactory.setDataSource(dataSource());
    entityManagerFactory.setPersistenceProviderClass(HibernatePersistence.class);
    entityManagerFactory.setPackagesToScan("com.skyteam.api.flightstatus.domain.persistence");
    Properties properties = new Properties();
    properties.put("hibernate.dialect", "org.hibernate.dialect.Oracle10gDialect");
    properties.put("hibernate.show_sql", "true");
    properties.put("hibernate.show_sql", "true");properties.put("hibernate.show_sql", "true");

我已经尝试使用hibernate的c3p0进行连接池,但它没有帮助。

properties.put("hibernate.c3p0.min_size", "5");
properties.put("hibernate.c3p0.max_size", "20");
properties.put("hibernate.c3p0.timeout", "300");
properties.put("hibernate.c3p0.max_statements", "50");
properties.put("hibernate.c3p0.idle_test_period.timeout", "3000");

有任何帮助吗? (注意 - 以前看似相似的问题没有帮助)

1 个答案:

答案 0 :(得分:1)

您似乎正在方法dataSource()中创建dataSource。

我相信,您有两种选择:

  1. 将该数据源包装到ComboPooledDataSource。它也是 实现javax.sql.DataSource接口并添加池 数据库连接。
  2. 不要显式创建数据源,而是让JPA创建它。 像这样:

    properites.put("javax.persistence.jdbc.driver","...");
    properites.put("javax.persistence.jdbc.url","...");
    properites.put("javax.persistence.jdbc.user","...");
    properites.put("javax.persistence.jdbc.password","...");