Hibernate 5.2.14+C3P0报错:驱动与URL均为null(无XML配置)求助
首先,这个错误的核心很明确:C3P0连接池没有获取到数据库连接的关键配置(驱动类、连接URL),结合你全程用Java配置而非XML的情况,我帮你梳理可能的原因和对应的修复方案:
问题背景回顾
我在使用Hibernate 5.2.14搭配C3P0连接池时,出现错误提示“C3P0 using driver: null at URL: null”,且全程未使用XML配置。我的HibernateConfiguration类代码如下:
@Configuration @EnableTransactionManagement @PropertySource({ "classpath:core.properties" }) @ComponentScan({ "com.test.core.domain" }) @EnableJpaRepositories(basePackages = "com.test.core.domain.dao") public class HibernateConfiguration { private static Logger logger = Logger.getLogger(HibernateConfiguration.class); @Autowired private Environment env; @Bean public LocalSessionFactoryBean entityManagerFactory() { LocalSessionFactoryBean localSessionFactoryBean =
可能的原因
LocalSessionFactoryBean初始化不完整:你提供的代码里entityManagerFactory()方法只写了开头,大概率是没有设置Hibernate的核心属性(尤其是数据库连接和C3P0相关配置),导致C3P0无法拿到必要参数。- 属性文件配置缺失或读取失败:
core.properties里可能没配数据库驱动、URL、用户名密码这些必填项,或者Environment读取时属性名拼写错误(比如把jdbc.url写成jdbc.urls)。 - C3P0与Hibernate的绑定配置缺失:Hibernate需要明确指定使用C3P0作为连接池,否则可能无法正确初始化C3P0。
具体修复步骤
1. 补全LocalSessionFactoryBean的配置代码
把你的entityManagerFactory()方法完善,设置好Hibernate的数据库连接属性和C3P0连接池参数:
@Bean public LocalSessionFactoryBean entityManagerFactory() { LocalSessionFactoryBean sessionFactory = new LocalSessionFactoryBean(); // 1. 设置实体类扫描路径(替换成你实际的实体类包路径) sessionFactory.setPackagesToScan("com.test.core.domain.entity"); // 2. 构建Hibernate配置属性 Properties hibernateProps = new Properties(); // 核心数据库连接参数(从core.properties读取) hibernateProps.put("hibernate.connection.driver_class", env.getProperty("jdbc.driverClassName")); hibernateProps.put("hibernate.connection.url", env.getProperty("jdbc.url")); hibernateProps.put("hibernate.connection.username", env.getProperty("jdbc.username")); hibernateProps.put("hibernate.connection.password", env.getProperty("jdbc.password")); // C3P0连接池配置 hibernateProps.put("hibernate.c3p0.min_size", env.getProperty("hibernate.c3p0.min_size")); hibernateProps.put("hibernate.c3p0.max_size", env.getProperty("hibernate.c3p0.max_size")); hibernateProps.put("hibernate.c3p0.timeout", env.getProperty("hibernate.c3p0.timeout")); hibernateProps.put("hibernate.c3p0.max_statements", env.getProperty("hibernate.c3p0.max_statements")); hibernateProps.put("hibernate.c3p0.idle_test_period", env.getProperty("hibernate.c3p0.idle_test_period")); // Hibernate基础配置(比如方言,根据你的数据库调整) hibernateProps.put("hibernate.dialect", env.getProperty("hibernate.dialect")); hibernateProps.put("hibernate.show_sql", env.getProperty("hibernate.show_sql")); hibernateProps.put("hibernate.format_sql", env.getProperty("hibernate.format_sql")); // 3. 把属性注入到SessionFactory sessionFactory.setHibernateProperties(hibernateProps); return sessionFactory; }
2. 确保core.properties包含完整配置
在src/main/resources/core.properties里添加以下配置(根据你的数据库类型调整,这里以MySQL为例):
# 数据库连接配置 jdbc.driverClassName=com.mysql.cj.jdbc.Driver # MySQL 8.x用这个,5.x用com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://localhost:3306/your_database_name?useSSL=false&serverTimezone=UTC jdbc.username=your_db_username jdbc.password=your_db_password # Hibernate基础配置 hibernate.dialect=org.hibernate.dialect.MySQL8Dialect hibernate.show_sql=true hibernate.format_sql=true # C3P0连接池配置 hibernate.c3p0.min_size=5 hibernate.c3p0.max_size=20 hibernate.c3p0.timeout=300 hibernate.c3p0.max_statements=50 hibernate.c3p0.idle_test_period=3000
3. 检查依赖是否齐全
如果用Maven,确保pom.xml里包含Hibernate核心、C3P0和数据库驱动的依赖:
<!-- Hibernate Core --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> <version>5.2.14.Final</version> </dependency> <!-- Hibernate C3P0集成包 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-c3p0</artifactId> <version>5.2.14.Final</version> </dependency> <!-- MySQL驱动(根据你的数据库替换) --> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
4. 验证属性读取是否正常
可以在entityManagerFactory()方法里加一行日志,验证Environment是否能正确读取属性:
logger.info("Loaded JDBC URL: " + env.getProperty("jdbc.url"));
如果日志里能打印出正确的URL,说明属性读取正常;如果是null,就检查core.properties的路径是否正确,或者属性名是否拼写错误。
验证修复效果
完成以上配置后,重启应用,观察日志。如果修复成功,C3P0会打印类似这样的初始化日志:
Initializing c3p0 pool... com.mchange.v2.c3p0.ComboPooledDataSource [ acquireIncrement -> 3, acquireRetryAttempts -> 30, acquireRetryDelay -> 1000, autoCommitOnClose -> false, ... ]
内容的提问来源于stack exchange,提问作者Green Root

