配置springboot使用c3p0连接池
为什么要使用c3p0?
使用springboot默认的数据源配置方式:
spring: datasource: driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8 username: root password: root
会存在mysql 8小时的问题,是无法在生产环境使用的,关于java中使用连接池引发的mysql 8小时问题。
springboot配置c3p0连接池
当然,除了c3p0连接池,你也可以使用其他连接池,我这里只不过是拿c3p0来举例子。
1.引入c3p0依赖
<dependency> <groupId>com.mchange</groupId> <artifactId>c3p0</artifactId> <version>0.9.2.1</version> </dependency>
2.在application.yml中配置c3p0连接池的属性
spring: datasource: type: com.mchange.v2.c3p0.ComboPooledDataSource driverClass: com.mysql.jdbc.Driver jdbcUrl: jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=UTF-8 user: root password: root maxPoolSize: 200 minPoolSize: 10 initialPoolSize: 10 acquireIncrement: 5 idleConnectionTestPeriod: 28000 maxIdleTime: 28000
注意,大家要理解,为什么一开始datasource下面是driver-class-name,而在c3p0配置的时候却成了driverClass,不仅如此,我们发现url、username也变成了jdbcUrl、user,为什么呢?因为这里写什么取决于type对应的类的属性,c3p0的com.mchange.v2.c3p0.ComboPooledDataSource类的属性是什么,这里就要写什么。
3.使用上面的配置生成bean,并放入spring的容器中。
import javax.sql.DataSource; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.boot.autoconfigure.jdbc.DataSourceBuilder; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Primary; import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; @Configuration public class DataSourceConfiguration extends WebMvcConfigurerAdapter { @Bean(name = "dataSource") @Qualifier(value = "dataSource") @Primary @ConfigurationProperties(prefix = "spring.datasource") public DataSource dataSource(){ DataSource dataSource=DataSourceBuilder.create() .type(com.mchange.v2.c3p0.ComboPooledDataSource.class).build(); return dataSource; } }
4.其实经过上面3步就已经完成了springboot使用c3p0的配置,下面我们来验证一下,怎么验证呢?我们在springboot的启动类中获取到注入的ComboPooledDataSource对应的bean,并查看它各个属性的值就可以了:
public static void main(String[] args) { ConfigurableApplicationContext run = SpringApplication.run(SbedaApplication.class, args); ComboPooledDataSource bean = run.getBean(ComboPooledDataSource.class); System.out.println(bean); }
在System.out.println(bean);这一行加个断点,debug模式启动springboot,可以看到ComboPooledDataSource类在spring中的bean对应的信息是:
而这个值就是我们指定的值,说明配置已经生效了,具体信息大家可以debug看一下ComboPooledDataSource类对应的bean的各个属性的值。