Spring Boot集成Druid

标签: Springboot 分类: Java 创建时间:2020-04-08 09:07:50 更新时间:2024-11-15 10:49:43

ClickHouse数据库之Java篇 文章中,我使用了Druid集成了Clickhouse数据库,这一篇文章,单独就Druid在SpringBoot中进行集成的若干问题进行入门指导。

引入Druid非常的简单,如果只是使用starter启动依赖,两步就够了。

1.增加启动器依赖

1
2
3
4
5
6
<!--Druid starter-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.22</version>
</dependency>

2.编写配置

编写配置文件,比如下面的使用的是mysql的jdbc,当然也可配置其他的数据库源。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/study_springboot?serverTimezone=UTC&useUnicode=true&characterEncoding=utf-8
username: root
password: root
## 指定启动配置
type: com.alibaba.druid.pool.DruidDataSource

druid:
#druid 数据源专有配置
# 初始化大小,最小,最大
initialSize: 5
minIdle: 5
maxActive: 200
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 用来检测连接是否有效的sql,要求是一个查询语句
validationQuery: SELECT 1 FROM DUAL
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
testWhileIdle: true
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能
testOnBorrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
testOnReturn: false
# 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。在mysql下建议关闭。
poolPreparedStatements: true
# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
max-pool-prepared-statement-per-connection-size: 50

#配置监控统计拦截的filters,stat:监控统计、log4j:日志记录、wall:防御sql注入
#如果允许时报错 java.lang.ClassNotFoundException: org.apache.log4j.Priority
#则导入 log4j 依赖即可,Maven 地址:https://mvnrepository.com/artifact/log4j/log4j
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,比如不配置stat,我们在Druid的监控页面中就拿不到想要的信息。
filters: stat,wall,log4j
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
参考文章:
1.SpringBoot整合Druid 这里有独立配置Druid,也有使用启动器配置,还有配置多数据源的方式。
2.MyBatis-Plus系列(一)–MyBatis-Plus集成Druid环境搭建 这里还结合了mybatis-plus
3.springboot下使用druid-spring-boot-starter Druid声称是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能。spring boot starter自动装配组件,简化组件引入的开发工作量,所以Druid推出了druid-spring-boot-starter,还讲了Druid的自动注入的原理。

3.多数据源

主要分为如下几步:
1.引入依赖,比druid多了一个 dynamic-datasource-spring-boot-starter
2.application.yml 配置,多了 dynamic 配置
3.启动类排除DRUID默认配置
4.切换数据源,主数据源不需要注解,再从数据源那里加上@DS注解

4.监控页面

5.sprintboot

要在 springboot 3 上使用,那就需要用springboot3 的依赖

1
2
3
4
5
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.22</version>
</dependency>

问题

(1) Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured.
这里我遇到了一个奇怪的问题,就是说我加了 druid-spring-boot-starter 这个启动依赖之后,最后还是出现了无法找到url配置,这个到底是什么问题呢?

经过重新新建了一个项目,编写yml配置文件,我发现了可以启动druid数据库连接迟,所以我想原因是因为我使用了nacos作为配置中心,但是应用程序没有找到127.0.0.1:8848这个配置中心中的配置。我缺少了 spring-cloud-starter-alibaba-nacos-config 这个依赖。

1
2
3
4
5
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
<version>2.1.0.RELEASE</version>
</dependency>
参考文章:
【1】.springboot提示‘url‘ attribute is not specified and no embedded datasource could be configured1、查看是否缺少jdbc依赖,如缺少加入以下内容。2.mapper.xml的namespace是否是正确。3、mapper.xml中语句的ID是否和方法名一致。4、mapper.xml中语句的parameterType和resultType对应的类型是否正确。5、还有一种情况就是项目的yml文件没有被扫描到,因为数据库连接配置都是在yml中配置的。这几个问题我都没有。
【2】.关于SpringBoot报错:Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded DataSourceAutoConfiguration会自动加载.可以排除此类的自动配置,在启动类中加入:@SpringBootApplication(exclude= {DataSourceAutoConfiguration.class})
【4】.SpringBoot 整合 Druid Failed to configure a DataSource: ‘url’ attribute is not specified and no embed_Java架构师Array的博客-程序员ITS404 网上的解决方案是错误的,例如:@SpringBootApplication(exclude = { DataSourceAutoConfiguration.class } 这种无法使用数据库进行接下来的操作
【5】.springboot启动报错 Failed to configure a DataSource: ‘url’ attribute is not specified and no embedded datasource could be configured. 在启动类的@EnableAutoConfiguration或@SpringBootApplication中添加exclude = {DataSourceAutoConfiguration.class},排除此类的autoconfig。

(2) Error creating bean with name ‘dataSource’: Unsatisfied dependency expressed through field ‘basicProperties’; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name ‘spring.datasource-org.springframework.boot.autoconfigure.jdbc.DataSourceProperties’: Invocation of init method failed; nested exception is java.lang.NoClassDefFoundError: org/springframework/jdbc/datasource/embedded/EmbeddedDatabaseType
这里添加了一个依赖

1
2
3
4
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
</dependency>

(3) Failed to bind properties under ‘spring.datasource.druid’ to javax.sql.DataSource:
这里是因为缺少了依赖,如何没有添加依赖log4依赖包会报错:Failed to bind properties under ‘spring.datasource’ to javax.sql.DataSource,也就是说你在配置里面添加了 filters: stat,wall,log4j,所以需要log4j这个类

1
2
3
4
5
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>

(4) discard long time none received connection
大致意思就是如果一个连接空闲超过60s,就丢弃之(holder)并且打印一条warn日志。

【解决方案】
给druid加一条配置: druid.mysql.usePingMethod=false。原理是让验证空闲连接不使用mysql的ping方法,而是使用select 1,这样每次进入上面提到的源码中时,时间都会刷新,就不会超过60s啦。

小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。