DataSource杂记

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类

  1. 使用@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;
}
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值