应用部署遇Hibernate内置连接池警告,求Weblogic连接池配置方案
我之前也碰到过一模一样的情况,折腾了好一阵才搞定。咱们一步步来排查和修复:
1. 移除冗余的JDBC驱动配置
你的persistence.xml里配置了javax.persistence.jdbc.driver,这是个坑!当你使用容器提供的数据源时,完全不需要指定驱动——数据源本身已经包含了驱动和连接信息,这个配置会让Hibernate误以为要自己管理连接,从而 fallback 到内置连接池。
把这行删掉:
<property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
2. 修正JNDI数据源的引用路径
因为你在web.xml里配置了<resource-ref>,容器会把数据源绑定到java:comp/env/命名空间下,所以你的hibernate.connection.datasource值应该用完整的JNDI路径,而不是直接写jdbc/myDS。
修改这行:
<property name="hibernate.connection.datasource" value="java:comp/env/jdbc/myDS"/>
3. 添加Weblogic JTA平台配置(关键!)
Weblogic是JTA事务容器,Hibernate需要知道如何和它的事务系统集成,否则可能无法正确识别容器数据源。在persistence.xml的<properties>里添加:
<property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform"/>
这个配置会让Hibernate适配Weblogic的JTA环境,确保它使用容器提供的数据源和事务管理。
4. 确保没有其他连接池相关配置
检查persistence.xml里有没有hibernate.connection.url、hibernate.connection.username、hibernate.connection.password这些配置——如果有的话,全部删掉。这些配置会覆盖数据源的设置,强制Hibernate使用内置连接池。
5. 确认EntityManager的获取方式正确
你提到是通过EntityManager获取Connection,一定要确保是通过容器注入的方式获取EntityManager,比如:
import javax.persistence.PersistenceContext; import javax.persistence.EntityManager; public class YourDao { @PersistenceContext(unitName = "MY-PERSISTENCE-UNIT") private EntityManager entityManager; // 然后通过entityManager获取连接 public void someMethod() { Connection conn = entityManager.unwrap(Connection.class); // ... } }
如果是手动创建EntityManagerFactory(比如Persistence.createEntityManagerFactory("MY-PERSISTENCE-UNIT")),容器的数据源配置可能不会生效,因为这种方式是应用自己初始化Hibernate,而不是由容器托管。
6. 验证Weblogic数据源配置
最后,确认Weblogic里的myDS数据源已经正确配置:
- 测试数据源连接是否正常(Weblogic控制台里可以测试)
- 确保数据源的JNDI名称确实是
myDS,和weblogic.xml里的<jndi-name>一致 - 数据源的目标服务器已经包含你部署应用的服务器
修改后的完整persistence.xml大概是这样:
<persistence...> <persistence-unit name="MY-PERSISTENCE-UNIT"> <description>Hibernate JPA Configuration</description> <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> <class>some classes...</class> <exclude-unlisted-classes>true</exclude-unlisted-classes> <properties> <property name="hibernate.connection.datasource" value="java:comp/env/jdbc/myDS"/> <property name="hibernate.hbm2ddl.auto" value="none"/> <property name="hibernate.show_sql" value="true"/> <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/> <property name="hibernate.transaction.jta.platform" value="org.hibernate.engine.transaction.jta.platform.internal.WeblogicJtaPlatform"/> </properties> </persistence-unit> </persistence>
按照这些步骤改完之后,重新部署应用,应该就不会再看到那个内置连接池的警告了,Hibernate会正确使用Weblogic的容器连接池。
内容的提问来源于stack exchange,提问作者ban

