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

标签 java spring jpa

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服务器和我的web应用程序在tomcat服务器启动后的一小段时间内运行良好。但是几个小时后,服务器报告一个sqlexception“连接已关闭”。

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

最佳答案

你可以让你的tomcat服务器或其他应用程序服务器提供JNDI数据源。这样,您的服务器容器的独立连接池可以很好地处理您的数据库连接/ session 。 在您的情况下,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以注入(inject)到您的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。

关于java - spring如何知道使用哪个连接池?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30441535/

相关文章:

java - JSP如何获取JSP中文件的完全限定名称

jquery - 如何在 JavaScript 代码中创建 JSTL foreach 循环?

java - 没有@Autowired的Spring Prototype-Bean Provider

java - 使用 OneToMany 属性上的过滤器查询实体会产生奇怪的结果

java - 名称为 "nashorn"的 ScriptEngine 为空

Java 无法连接到包含变音符号的 URL

spring - 使用 WebClient 将 Spring Webflux 应用程序中接收到的请求 header 传播到下游服务

java - 登录认证-空指针异常

java - Hibernate 省略 JsonManagedReference 来持久化

java - 当我在 Android Studio 上运行我的应用程序时,模拟器启动,但它说测试应用程序崩溃了