现在有点搞不懂这些写博客的,就不能自己测试下吗。搜篇 spring boot 配置 Druid连接池
,浏览了几篇好像没一篇可行的。
因为版本迭代有问题可以理解,但是这些人提供的方法 都不是这个原因
com.alibaba
druid
1.0.16
这里坑比较多,很容易出问题。
# 驱动配置信息
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.url = jdbc:mysql://127.0.0.1:3306/test1?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
spring.datasource.username = root
spring.datasource.password =
spring.datasource.driverClassName = com.mysql.cj.jdbc.Driver
#连接池的配置信息
spring.datasource.initialSize=5
spring.datasource.minIdle=5
spring.datasource.maxActive=20
spring.datasource.maxWait=60000
spring.datasource.timeBetweenEvictionRunsMillis=60000
spring.datasource.minEvictableIdleTimeMillis=300000
spring.datasource.validationQuery=SELECT 1 FROM DUAL
spring.datasource.testWhileIdle=true
spring.datasource.testOnBorrow=false
spring.datasource.testOnReturn=false
spring.datasource.poolPreparedStatements=true
spring.datasource.maxPoolPreparedStatementPerConnectionSize=20
spring.datasource.filters=stat,wall
spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
spring.datasource.url
serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.
如果 url 的配置不添加 serverTimezone=UTC
会报如上错误
spring.datasource.driverClassName
Loading class 'com.mysql.jdbc.Driver'. This is deprecated. The new driver class is 'com.mysql.cj.jdbc.Driver'. The driver is automatically registered via the SPI and manual loading of the driver class is generally unnecessary.
这里很容易看懂,应该是版本的问题。将以前的
com.mysql.jdbc.Driver
替换成
com.mysql.cj.jdbc.Driver
spring.datasource.filters
Caused by: org.springframework.boot.context.properties.bind.BindException: Failed to bind properties under 'spring.datasource.druid' to javax.sql.DataSource at org.springframework.boot.context.properties.bind.Binder.handleBindError(Binder.java:250)
这里我搜出来很多博客都是如下配置的
spring.druid.filters=stat,wall,log4j
这也是个坑,将 log4j 去掉。改成如下配置
spring.datasource.filters=stat,wall
大家都知道,spring boot 后面版本不支持配置文件中的配置,其实也可以自己测一测。配置完运行后全是空的,都没起作用。所以要去 java 代码中配置 datasource 。并不需要将所有属性都定义出来,用到那些定义那些即可,下面是我的。
package com.kstar.kxiaoju.config;
import com.alibaba.druid.pool.DruidDataSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import javax.sql.DataSource;
import java.sql.SQLException;
/**
* Created by [email protected] on 2018/12/17
* Description:
*/
@Configuration
public class DruidDBConfig {
private Logger logger = LoggerFactory.getLogger(DruidDBConfig.class);
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.driverClassName}")
private String driverClassName;
@Value("${spring.datasource.initialSize}")
private int initialSize;
@Value("${spring.datasource.minIdle}")
private int minIdle;
@Value("${spring.datasource.maxActive}")
private int maxActive;
@Value("${spring.datasource.maxWait}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.maxPoolPreparedStatementPerConnectionSize}")
private int maxPoolPreparedStatementPerConnectionSize;
@Value("${spring.datasource.filters}")
private String filters;
@Value("${spring.datasource.connectionProperties}")
private String connectionProperties;
@Bean //声明其为Bean实例
@Primary //在同样的DataSource中,首先使用被标注的DataSource
public DataSource dataSource(){
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(username);
datasource.setPassword(password);
datasource.setDriverClassName(driverClassName);
//configuration
datasource.setInitialSize(initialSize);
datasource.setMinIdle(minIdle);
datasource.setMaxActive(maxActive);
datasource.setMaxWait(maxWait);
datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
datasource.setValidationQuery(validationQuery);
datasource.setTestWhileIdle(testWhileIdle);
datasource.setTestOnBorrow(testOnBorrow);
datasource.setTestOnReturn(testOnReturn);
datasource.setPoolPreparedStatements(poolPreparedStatements);
datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
try {
datasource.setFilters(filters);
} catch (SQLException e) {
logger.error("druid configuration initialization filter", e);
}
datasource.setConnectionProperties(connectionProperties);
return datasource;
}
}
这几个注解的意思: DruidDBConfig类被@Configuration标注,用作配置信息; DataSource对象被@Bean声明,为Spring容器所管理, @Primary表示这里定义的DataSource将覆盖其他来源的DataSource。 (复制别的博客)
package com.kstar.kxiaoju.config;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
/**
* Created by [email protected] on 2018/12/14
* Description:
*/
@Configuration
public class DruidConfig {
/**
* 配置druid监控
* 配置一个管理后台的servlet
* 访问地址:http://localhost:8080/druid/
* @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map initParameters = new HashMap();
initParameters.put("loginUsername", "admin");//属性见:com.alibaba.druid.support.http.ResourceServlet
initParameters.put("loginPassword", "123456");
initParameters.put("allow", "");//默认允许所有
initParameters.put("deny", "");
bean.setInitParameters(initParameters);
return bean;
}
/**
* 配置一个web监控的filter
* @return
*/
@Bean
public FilterRegistrationBean webStatFilter() {
FilterRegistrationBean filterBean = new FilterRegistrationBean();
filterBean.setFilter(new WebStatFilter());
filterBean.setUrlPatterns(Arrays.asList("/*"));
Map initParameters = new HashMap();
initParameters.put("exclusions", "*.js,*.css,/druid/*");//属性见:com.alibaba.druid.support.http.WebStatFilter
filterBean.setInitParameters(initParameters);
return filterBean;
}
}
package com.kstar.kxiaoju;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
/**
* Created by [email protected] on 2018/12/17
* Description:
*/
@RestController
public class A {
@Autowired
private DataSource dataSource;
@RequestMapping("/dataSource")
public String dataSource() {
try {
System.out.println("dataSource = "+dataSource);
Connection conn = dataSource.getConnection();
System.out.println("conn = "+conn);
return "success";
} catch (SQLException e) {
e.printStackTrace();
}
return "end.";
}
}
可以自行测试下,我这边没问题。
https://blog.csdn.net/blueheart20/article/details/52384032
https://blog.csdn.net/booloot/article/details/76223004
https://fanshuyao.iteye.com/blog/2415353
https://blog.csdn.net/L_Sail/article/details/70233529
https://github.com/alibaba/druid/issues/2577