最初是操作数据库的时候去建立数据库连接,操作完成之后再关闭这个连接;到后面发现这样大部分时间都花在了建立数据库连接上,业务增长时会严重影响程序的性能
所以就出现了数据库连接池,它可以在系统初始化的时候一次创建多个数据库连接放入连接池当中,并且可以随着业务的变动动态的增加或减少连接池当中的连接,这样就不仅能够提高程序性能,并且解放开发人员,让其专注于业务
常用的数据库连接池
SpringBoot中常用的数据库连接池有两种:HicariCP和Druid,它们可以满足多种不同的应用场景,下面就从实际应用来介绍一下
HicariCP
HicariCP是SpringBoot2.0之后默认的数据库连接池,特点就是:简单,高效,史称最快的数据库连接池
SpringBoot中HicariCP的依赖
SpringBoot项目中如果使用到了spring-boot-starter-jdbc或者spring-boot-starter-data-jpa的starter,那就会自动引入HicariCP的依赖了,如果没有,那么也可以直接添加HicariCP的依赖,如下所示:
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>2.5.1</version>
</dependency>
HicariCP使用
首先就是对数据源的配置,下面是一个基于Postgre数据库的配置,首先还是要引入postgre依赖,如下所示:
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
接下来在resource/application.properties中添加如下的配置:
spring.datasource.url=jdbc:postgresql://localhost:5432/test?tcpKeepAlive=true
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.hikari.connection-timeout=20000 //超时连接时间
spring.datasource.hikari.minimum-idle=5 // 最小空闲连接
spring.datasource.hikari.maximum-pool-size=12 // 最大连接数
spring.datasource.hikari.idle-timeout=300000 // 连接允许在池中闲置的最长时间
spring.datasource.hikari.max-lifetime=1200000 // 连接最大生命周期
spring.datasource.hikari.auto-commit=true // 自动提交从池中返回的连接
因为HicariCP实现了Datasource接口,JPA会自动装配Datasource,所以就可以直接使用JPA来查询数据了,如下所示的例子:
@Data
@Entity //表明此实体是一个被 JPA管理的实体类
public class Config {
@Id
private String name;
private String params;
}
然后,再创建Repository类,如下所示:
import org.springframework.data.repository.CrudRepository;
import com.example.demo.models.Config;
public interface ConfigRepository extends CrudRepository<Config,Long> {
}
之后就可以在 service中使用该实体的crud操作了,如下所示:
@Service
public class ConfigService implements IConfigService {
@Autowired
private ConfigRepository repo;
@Override
public List<Config> getAllConfig(){
List<Config> list = new ArrayList<>();
repo.findAll().forEach(e ->list.add(e));
return list;
}
}
Druid连接池
Druid是阿里开源的数据库连接池,结合了其他数据库连接池的优点,相较于HicariCP增加了监控功能同时还不影响性能,并且能够防止SQL注入,内置的Logging能够诊断Hack的行为
SpringBoot整合Druid依赖
SpringBoot整合Druid可以使用Druid依赖,也可以使用Druid Stater依赖;前者需要程序中加载数据源,后者则会直接通过spring-boot自动装配
Durid依赖
首先需要在 pom.xml文件中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!--Druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.22</version>
</dependency>
<!--postgre-->
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
然后在配置文件中添加配置:
spring:
datasource:
## 指定数据库连接池类型,如果可以得到HikariCP连接池类,就优先配置HikariCP
type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:postgresql://localhost:5432/test?tcpKeepAlive=true
username: postgres
password: postgres
driver-class-name: org.postgresql.Driver
最后在代码中加载Druid数据源就好了
@Configuration
public class DruidConfig {
@Bean
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource druidDataSource(){
return new DruidDataSource();
}
}
这样就直接将Druid类型的数据库加载到SpringBoot中了,其他组件就可以自动装配了,下面是一个测试用例:
@SpringBootTest
class DemoApplicationTests {
@Autowired
private DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
System.out.println(dataSource.getClass());
Connection connection = dataSource.getConnection();
System.out.println(connection);
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println("druidDataSource 数据源最大连接数:" + druidDataSource.getMaxActive());
System.out.println("druidDataSource 数据源初始化连接数:" + druidDataSource.getInitialSize());
connection.close();
}
}
Druid Starter依赖
当然也可以直接使用Druid stater依赖,这样就不需要我们手动去加载Druid数据源了,程序启动的时候就会自动加载到SpringBoot中了
Druid starter依赖如下:
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>
接下来再添加配置文件就可以了
spring:
datasource:
# type: com.alibaba.druid.pool.DruidDataSource
url: jdbc:postgresql://172.21.84.188:5432/ticket?tcpKeepAlive=true
username: postgres
password: 123456
driver-class-name: org.postgresql.Driver
druid:
initialSize: 5
minIdle: 5
maxActive: 200
maxWait: 60000
这样就可以使用SpringBoot自动装配了,下面是测试代码:
@SpringBootTest
class DemoApplicationTests {
@Autowired
private DataSource dataSource;
@Test
public void contextLoads() throws SQLException {
Connection connection = dataSource.getConnection();
System.out.println(connection);
DruidDataSource druidDataSource = (DruidDataSource) dataSource;
System.out.println("druidDataSource 最大连接数:" + druidDataSource.getMaxActive());
System.out.println("druidDataSource 初始化连接数:" + druidDataSource.getInitialSize());
connection.close();
}
}
使用starter更加的方便,只需要添加相应的配置就可以了