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

时间:2015-05-25 15:26:23

标签: java spring jpa

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

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

我对春天的注释非常困惑" @ PersitenceContext"在entityManager字段上方。 我的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&#34; Connection已经关闭&#34;。

这是滥用数据库连接池的问题吗? spring框架如何选择c3p0或DBCP?我如何指定连接池?或者tomcat是否使用默认DBCP作为连接池?

1 个答案:

答案 0 :(得分:2)

您可以使您的tomcat服务器或其他应用服务器提供JNDI数据源。这样,您的服务器容器的自包含连接池可以很好地处理您的数据库连接/会话。 在您的情况下,您在$ 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使用DBCP与类型的&#34; java.sql.DataSource&#34; 。 确保在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.Please refer to here

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

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