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作为连接池?
答案 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。