如何处理由EntityManager通过Spring应用程序建立的连接池大小

时间:2014-11-27 09:06:06

标签: java spring spring-mvc jpa

我们有一个使用Spring MVC 3.2作为ORM框架实现JPA的Web应用程序。现在的问题是EntityManager正在与数据库创建大量的开放连接。我们希望以这样的方式处理它:对于每个查询,应该建立连接并在完成后关闭。

根据spring实现,EntityManager创建一次。但问题是我们在某种程度上想要处理EntityManager为查询数据库而创建的客户端连接。

每当在数据库中完成查询时,该连接就会进入休眠状态,而我们希望在查询返回结果后关闭它。

数据库类型:MySQL

我对JPA的配置是:

<tx:annotation-driven transaction-manager="transactionManager" />
<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" />

<bean id="entityManagerFactory"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="com.reppify" />
    <property name="jpaPropertyMap" ref="jpaPropertyMap" />
    <property name="dataSource" ref="dataSourceLocal" />
    <property name="persistenceUnitName" value="cron-jpa" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
</bean>

<bean id="dataSourceLocal"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${database.driver}" />
    <property name="url" value="${database.url}" />
    <property name="username" value="${database.user}" />
    <property name="password" value="${database.password}" />
</bean>  

我们使用hibernate-jpa-api-2.0 jar作为项目的依赖项 我注入EntityManager的JAVA Base DAO实现如下:

protected EntityManager entityManager;

@PersistenceContext
public void setEntityManager(EntityManager entityManager) {
    this.entityManager = entityManager;
}

请为我们提供最佳解决方案。

1 个答案:

答案 0 :(得分:4)

DriverManagerDataSource不是连接池,它会在每次调用时创建一个新连接。此类对于测试很有用,但您不应在生产中使用它,而是选择连接池。有许多连接池可供选择: