为什么要使用Druid连接池?
通常我们是直接通过mybatis与数据库建立连接,而创建连接的过程是在发起请求和接受请求之间进行的,这样请求就会消耗更多的时间。并且在大型的web项目中,当有成百上千个请求发给数据库时,数据库就会为每个请求都分配一个数据库连接,这样就会导致请求的性能会很差。
而对于druid连接池而言,在tomcat启动时,就会自动创建多个连接对象,并且保存在连接池中。当接收到请求时,直接从连接池中取出,用完后再放回连接池中即可。同时Druid连接池还提供了监控功能可以实时对数据进行分析。
org.springframework.boot
spring-boot-starter-web
2.5.3
com.alibaba
druid-spring-boot-starter
1.1.21
com.baomidou
mybatis-plus-boot-starter
3.4.3
mysql
mysql-connector-java
8.0.26
spring:
datasource:
druid:
#开启监控的配置
stat-view-servlet:
login-username: admin #druid登录时的账号密码
login-password: 123456
reset-enable: false #是否开启重置监控数据
url-pattern: /druid/* #登录druid网页后缀
enabled: true #开启监控
allow: #添加IP白名单,不写就是所有都允许
#deny: #添加IP黑名单
#监控配置中的 web监控
web-stat-filter:
enabled: true #表示开启
url-pattern: /* #url
#忽略过滤格式
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
#数据源1(名字自己定),以下数据对应自己数据库
jt:
#以下内容根据自己数据库而定
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/jt?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
type: com.alibaba.druid.pool.DruidDataSource
#druid数据源配置
initial-size: 5 #初始化大小
min-idle: 5 #最小连接数
max-active: 20 #最大连接数
max-wait: 10000 #最大等待时间(毫秒)
#监控sql统计时,拦截stat(监控统计的sql),wall(防御sql注入),slf4j(日志用的sql)
filters: stat,wall
#druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,oracle: select 1 from dual
validation-query: select 1
#申请连接时检测validation-query是否有效,降低性能,关闭
test-on-borrow: false
#归还连接时检测validation-query是否有效,降低性能,关闭
test-on-return: false
#申请连接时检测validation-query是否有效,提高安全性,不影响性能
test-while-idle: true
#配置隔多久进行一次检测(检测可以关闭的空闲连接),单位毫秒
time-between-eviction-runs-millis: 60000
#数据源2(名字自己定),以下数据对应自己数据库
mybatisdb:
#以下内容根据自己数据库而定
username: root
password: root
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://127.0.0.1:3306/mybatisdb?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf8&autoReconnect=true&allowMultiQueries=true
type: com.alibaba.druid.pool.DruidDataSource
#druid数据源配置
initial-size: 5 #初始化大小
min-idle: 5 #最小连接数
max-active: 20 #最大连接数
max-wait: 10000 #最大等待时间(毫秒)
#监控sql统计时,拦截stat(监控统计的sql),wall(防御sql注入),slf4j(日志用的sql)
filters: stat,wall
#druid用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,oracle: select 1 from dual
validation-query: select 1
#申请连接时检测validation-query是否有效,降低性能,关闭
test-on-borrow: false
#归还连接时检测validation-query是否有效,降低性能,关闭
test-on-return: false
#申请连接时检测validation-query是否有效,提高安全性,不影响性能
test-while-idle: true
#配置隔多久进行一次检测(检测可以关闭的空闲连接),单位毫秒
time-between-eviction-runs-millis: 60000
当存在多个数据源时,需要进行数据源指定。否则无法识别数据源。
从已经配置的application.yml中可以看出目前有两个数据源 jt 和 mybatisdb。
package com.jt.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @author: czc
* @date: 2022/1/14 9:24
* @description:
*/
// @Configuration表示此类为配置类
@Configuration
// @MapperScan表示对此"com.jt.mapper"路径的文件配置 jtSqlSessionTemplate
@MapperScan(basePackages = {"com.jt.mapper"} , sqlSessionTemplateRef = "jtSqlSessionTemplate")
public class JtMybatisConfig {
@Bean("jtDataSource")
// @ConfigurationProperties把"spring.datasource.jt"配置路径下的配置用于druid
@ConfigurationProperties(prefix = "spring.datasource.jt")
public DataSource jtDataSource(){
DruidDataSource druid = new DruidDataSource();
return druid;
}
@Bean("jtSqlSessionFactory")
public SqlSessionFactory jtSqlSessionFactory(
// @Qualifier用于指定某个bean对象
@Qualifier("jtDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean SqlSessionFactory = new MybatisSqlSessionFactoryBean();
SqlSessionFactory.setDataSource(dataSource);
MybatisConfiguration Configuration = new MybatisConfiguration();
Configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
Configuration.setJdbcTypeForNull(JdbcType.NULL);
SqlSessionFactory.setConfiguration(Configuration);
// getResources方法表示resources路径
// *表示所有
SqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath:mappers/*.xml"));
SqlSessionFactory.setGlobalConfig(new GlobalConfig().setBanner(false));
return SqlSessionFactory.getObject();
}
@Bean("jtSqlSessionTemplate")
public SqlSessionTemplate jtSqlSessionTemplate(@Qualifier("jtSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
// 数据源的事务管理
@Bean("jtTransactionManager")
public DataSourceTransactionManager jtTransactionManager(@Qualifier("jtDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
package com.jt.config;
import com.alibaba.druid.pool.DruidDataSource;
import com.baomidou.mybatisplus.core.MybatisConfiguration;
import com.baomidou.mybatisplus.core.MybatisXMLLanguageDriver;
import com.baomidou.mybatisplus.core.config.GlobalConfig;
import com.baomidou.mybatisplus.extension.spring.MybatisSqlSessionFactoryBean;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.type.JdbcType;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @author: czc
* @date: 2022/1/14 9:26
* @description:
*/
//注释同上的含义
@Configuration
@MapperScan(basePackages = {"com.jt.mapper1"} , sqlSessionTemplateRef = "mybatisdbSqlSessionTemplate")
public class MybatisdbMybatisConfig {
@Bean("mybatisdbDataSource")
@ConfigurationProperties("spring.datasource.mybatisdb")
public DataSource mybatisdbDataSource(){
DruidDataSource druid = new DruidDataSource();
return druid;
}
@Bean("mybatisdbSqlSessionFactory")
public SqlSessionFactory mybatisdbSqlSessionFactory(
@Qualifier("mybatisdbDataSource") DataSource dataSource) throws Exception {
MybatisSqlSessionFactoryBean SqlSessionFactory = new MybatisSqlSessionFactoryBean();
SqlSessionFactory.setDataSource(dataSource);
MybatisConfiguration Configuration = new MybatisConfiguration();
Configuration.setDefaultScriptingLanguage(MybatisXMLLanguageDriver.class);
Configuration.setJdbcTypeForNull(JdbcType.NULL);
SqlSessionFactory.setConfiguration(Configuration);
SqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath:mappers1/*.xml"));
SqlSessionFactory.setGlobalConfig(new GlobalConfig().setBanner(false));
return SqlSessionFactory.getObject();
}
@Bean("mybatisdbSqlSessionTemplate")
public SqlSessionTemplate jtSqlSessionTemplate(@Qualifier("mybatisdbSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
return new SqlSessionTemplate(sqlSessionFactory);
}
@Bean("mybatisdbTransactionManager")
public DataSourceTransactionManager jtTransactionManager(@Qualifier("mybatisdbDataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}
}
1. @MapperScan 路径
//jt数据源
@MapperScan(basePackages = {"com.jt.mapper"} ,
sqlSessionTemplateRef = "jtSqlSessionTemplate")
//mybatisdb数据源
@MapperScan(basePackages = {"com.jt.mapper1"} ,
sqlSessionTemplateRef = "mybatisdbSqlSessionTemplate")
2. xml文件 路径
// jt数据源
SqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath:mappers/*.xml"));
// mybatisdb数据源
SqlSessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver().
getResources("classpath:mappers1/*.xml"));
登录网页:http://127.0.0.1:8080/druid
注意:把 ip 和 端口 更改成自己的