1、在application.properties中配置数据库连接的信息;
-
在url后面加上useUnicode=true&characterEncoding=UTF-8 目的是指定字符的编码、解码格式。防止出现字符乱码。
-
例如:mysql数据库用的是gbk编码,而项目数据库用的是utf-8编码。这时候如果添加了useUnicode=true&characterEncoding=UTF-8 ,那么作用有如下两个方面:
1、存数据时:
数据库在存放项目数据的时候会先用UTF-8格式将数据解码成字节码,然后再将解码后的字节码重新使用GBK编码存放到数据库中。
2、取数据时:
数据库会先将数据库中的数据按GBK格式解码成字节码,然后再将解码后的字节码重新按UTF-8格式编码数据,最后再将数据返回给客户端。
-
-
minIdle:线程池最小空闲数,Druid会定期扫描连接数情况,如果扫描的值大于该值就关闭多余的连接数,小于就创建符合要求的连接数;
-
设置这个参数可以应对突发流量,如果没有设置空闲连接,当有多个请求同时调用数据库,但是连接池中并没有可用连接,这时就必须创建连接,创建连接是一个非常耗时的操作,有可能会导致请求超时。
-
db.driverClassName=com.mysql.jdbc.Driver //使用的驱动名称
db.url= 数据库地址?useUnicode=true&characterEncoding=utf8&autoReconnect=true&useSSL=true
//数据库的地址
db.initialSize=20 //程序启动时默认创建的数据库连接数
db.maxTotal=60 //最大连接数
db.minIdle=20 //线程池最小空闲数目
db.maxWaitMillis=5000 //获取连接时最大等待的毫秒数
2、编写DataSourceConfig类
- 使用@Value给各个属性赋值;
@Value(“${xxxx}”)注解从配置文件读取值的用法,也就是从application.properties文件中获取值。
@Value("${db.driverClassName}")
private String driverClassName;
2、buildDataSource
@Bean
@Bean明确地指示了一种产生一个bean的方法,并且交给Spring容器管理;
@Bean是放在方法的注释上,让注释的方法产生一个Bean,然后交给Spring容器。
@Primary注解
标识哪个Bean是默认的Bean,@Autowired是通过类型注入,ByType的形式,来给指定的字段和方法来注入所需的外部资源,当存在多个相同类型的Bean注入时,Spring不知道注入哪个实现,所以在启动的时候会抛出异常。因此给指定的组件添加@primary后,默认会注入@Primary的配置组件。
@Bean
@Primary
public DataSource dataSource() {
return DataSourceBuilder.buildDataSource(new DataSourceBuilder.Builder()
.setDriverClassName(driverClassName)
.setUrl(url)
.setUsername(username)
.setPassword(password)
.setMaxTotal(maxTotal)
.setMinIdle(minIdle)
.setInitialSize(initialSize)
.setMaxWaitMillis(maxWaitMillis));
}
3、DataSourceBuilder
SqlSessionFactoryBean是生产SqlSessionFactory的一种工厂Bean;SqlSessionFactory是一种生产SqlSession的工厂;SqlSession是代表数据库连接客户端和数据库Server之间的会话信息;SqlSessionTemplate是SqlSession的一个具体实现。
有关三者的联系可以看一下原文,讲得很好:
https://www.jianshu.com/p/f19a58938959
- 数据库连接状态生成类,对{@link DruidDataSource DruidDataSource}连接参数的桥接封装,具体参数请参考DruidDataSource类。
public static class Builder {
/**
* 最大连接数,默认为8
*/
private int maxTotal = 50;
/**
* 最少空闲的连接数,默认为10
*/
private int minIdle = 10;
/**
* 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
*/
private int initialSize = 10;
/**
* 当连接池资源耗尽时,调用者最大阻塞的时间,超时将抛出异常。单位,毫秒,负值(-1)表示永不超时;默认为5s
* 配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁
*/
private long maxWaitMillis = 5000L;
/**
* “空闲链接”检测线程,检测的周期,毫秒。如果为负值,表示不运行“检测线程”。默认为10min
*/
private long timeBetweenEvictionRunsMillis = 600000L;
/**
* 连接空闲的最小时间,达到此值后空闲连接将可能会被移除。负值(-1)表示不移除。默认为10min
*/
private long minEvictableIdleTimeMillis = 600000L;
}
public static DataSource buildDataSource(Builder builder) {
DruidDataSource datasource = new DruidDataSource();
datasource.setDriverClassName(builder.getDriverClassName());
// <!-- 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会其作用。
datasource.setValidationQuery("SELECT 'x'");
// <!-- 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。 -->
datasource.setTestWhileIdle(true);
// <!-- 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 -->
datasource.setTestOnBorrow(false);
// <!-- 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。 -->
datasource.setTestOnReturn(false);
// <!-- 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。 -->
datasource.setPoolPreparedStatements(false);
datasource.setKeepAlive(true);
return datasource;
}