【问题标题】:how does spring know which connection pool to use?spring如何知道使用哪个连接池?
【发布时间】:2015-05-25 15:26:23
【问题描述】:

spring如何知道使用哪个连接池?

众所周知,您告诉 spring 框架一个持久化单元名称,并使用 @PersistenceContext 注释实体管理器,并配置 Persistence.xml。Spring 为您做所有事情。

我对 entityManager 字段上方的spring注解“@PersitenceContext”感到很困惑。 我的 persistence.xml 如下:

<persistence-unit name="hibernate.recommendation_report.jpa">
    <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
    <properties>
        <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@192.168.113.226:11521:BOSS" />
        <property name="javax.persistence.jdbc.user" value="xxxx" />
        <property name="javax.persistence.jdbc.password" value="xxxx" />
    </properties>
</persistence-unit>

我的 tomcat 服务器和我的 webapp 在启动 tomcat 服务器后的一小段时间内运行良好。但是几个小时后,服务器报告了一个 sqlexception“连接已经关闭”。

这是误用db连接池的问题吗? spring 框架如何选择 c3p0 或 DBCP ?我将如何指定连接池?还是tomcat使用默认的DBCP作为连接池?

【问题讨论】:

  • 春天和这有什么关系?您提供了一个不使用任何连接池的持久性单元,除了 JPA 提供者使用的内容。您的 JPA 提供程序是创建池的原因
  • 不要为我查找persistence.xml并初始化数据源?我认为JPA提供者只是管理实体。如果我可以在persistence.xml中放置一些标签/配置到指定框架使用的连接池。
  • 没有。 JPA 提供者查找数据源,因为需要该数据源来持久化/查询实体。

标签: java spring jpa


【解决方案1】:

你可以让你的tomcat服务器或其他应用服务器提供JNDI数据源。因此,您的服务器容器的自包含连接池可以很好地处理您的数据库连接/会话。 在您的情况下,Tomcat,您在 $TOMCAT_HOME/conf/context.xml 或 server.xml 中指定 JNDI 数据源:

<Resource name="jdbc/sample" auth="Container"
    type="com.mchange.v2.c3p0.ComboPooledDataSource"
    username=...
    password=...
    url=...
    driverClassName=...
/> 

type 属性告诉tomcat 使用哪个连接池。 默认情况下,tomcat6 使用类型为“java.sql.DataSource” 的 DBCP。 确保在您的 persistence.xml 中使用 JNDI 引用:

<persistence version="2.1" ....>
    <persistence-unit name="hibernate.recommendation_report.jpa">
        <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
        <non-jta-data-source>java:comp/env/jdbc/sample</non-jta-data-source>
    </persistence-unit>
</persistence>

或者使用spring xml配置数据源bean注入到你的entityManagerFactory。请refer to here

<jee:jndi-lookup id="dataSource" jndi-name="java:sample"/>

查看其他 JNDI 资源 attributes available for DBCP。 注意:persistence.xml 数据源中的“java:comp/env/”前缀非常重要。没有它,Spring 将不会寻找您的应用程序服务器提供的池来获取数据源,而只是使用该属性构造一个简单的数据源。 注意:tomcat8 本身提供了一个更好的池。如果你升级到 tomcat8。

【讨论】:

  • 除了用户没有指定 JNDI 数据源。他指定了连接 U​​RL 和驱动程序。所以这是 JPA 提供者的责任,正如 JPA 规范中所定义的那样。
  • 在只提供URL和驱动等的情况下,JPA提供者,例如hibernate是如何管理连接池的?能否请您提供一些hibernate官方的文档?
  • 我不使用休眠。我使用 DataNucleus JPA。它的连接池文档显示在datanucleus.org/products/accessplatform_4_1/jpa/… 看不到为什么其他人不会以完全相同的方式进行操作......即他们为相应的池创建一个数据源,并像在任何情况下一样获取/关闭连接JDBC 使用情况
  • 好吧,我猜您的 DataNucleus JPA 提供商也提供了连接池实现。因此它可以帮助您完成池工作。
猜你喜欢
  • 2018-09-24
  • 1970-01-01
  • 1970-01-01
  • 2012-12-04
  • 1970-01-01
  • 2014-08-27
  • 2019-03-15
  • 2022-01-18
  • 1970-01-01
相关资源
最近更新 更多