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

Java spring如何知道使用哪个连接池?,java,spring,jpa,Java,Spring,Jpa,spring如何知道使用哪个连接池 众所周知,您可以告诉spring框架一个持久化单元名称,并使用@PersistenceContext和persistence.xml对实体管理器进行注释。spring为您做每件事 我对entityManager字段上方的spring注释“@persistenceContext”感到非常困惑。 我的persistence.xml如下: <persistence-unit name="hibernate.recommendation_report.jpa"&

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

众所周知,您可以告诉spring框架一个持久化单元名称,并使用@PersistenceContext和persistence.xml对实体管理器进行注释。spring为您做每件事

我对entityManager字段上方的spring注释“@persistenceContext”感到非常困惑。 我的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>

org.hibernate.jpa.HibernatePersistenceProvider
我的tomcat服务器和我的webapp在启动tomcat服务器后的一段短时间内运行良好。但数小时后,服务器报告sqlexception“连接已关闭”


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

U可以让您的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>

org.hibernate.jpa.HibernatePersistenceProvider
java:comp/env/jdbc/sample
或者使用SpringXML配置要注入entityManagerFactory的数据源bean


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

spring与此有什么关系?除了JPA提供程序使用的连接池之外,您不使用任何连接池来提供持久化单元。您的JPA提供程序是池的创建者。请不要为我spring查找persistence.xml并初始化数据源?我认为JPA提供程序只是管理实体。我想知道是否可以在persistence.xml中放置一些标记/配置,以指定框架要使用的连接池。否。JPA提供程序查找数据源,因为需要该数据源来持久化/查询实体。但用户没有指定JNDI数据源。他指定了一个连接URL和驱动程序。因此,这是JPA规范中定义的JPA提供商的责任。在仅提供URL和驱动程序等的情况下,JPA提供商(例如hibernate)如何管理连接池?请出示hibernate官方提供的一些文档好吗?我不使用hibernate。我使用DataNucleus JPA。它的连接池文档显示在“我看不出为什么其他人不会以完全相同的方式执行此操作…”。。。i、 e他们为各自的池创建一个数据源,并获得/关闭连接,就像您在任何JDBC使用中一样。我想您的DataNucleus JPA提供程序也提供了连接池实现。因此,它可以帮助您完成池工作。
<jee:jndi-lookup id="dataSource" jndi-name="java:sample"/>