




















at sun.misc.Unsafe.park(Native Method)
高并发场景,Druid获取数据库连接 一直等待 ,获取不了数据库链接; 服务tomcat线程占满,无响应
确保 spring.datasource.maxWait 不为 -1, -1表示获取链接时不超时(永久等待), 可以配置为6000, 参考配置
没有采用druid starter的情况下, 可以试下在代码中手动配置 DataSource
@Slf4j
@Configuration
public class DruidConfig {
@Value("${spring.datasource.url}")
private String dbUrl;
@Value("${spring.datasource.username}")
private String username;
@Value("${spring.datasource.password}")
private String password;
@Value("${spring.datasource.druid.username:admin}")
private String druidUsername;
@Value("${spring.datasource.druid.password:hd123}")
private String druidPassword;
@Value("${spring.datasource.driver-class-name:com.mysql.jdbc.Driver}")
private String driverClassName;
@Value("${spring.datasource.initialSize:10}")
private int initialSize;
@Value("${spring.datasource.minIdle:10}")
private int minIdle;
@Value("${spring.datasource.maxActive:1000}")
private int maxActive;
@Value("${spring.datasource.maxWait:-1}")
private int maxWait;
@Value("${spring.datasource.timeBetweenEvictionRunsMillis:60000}")
private int timeBetweenEvictionRunsMillis;
@Value("${spring.datasource.minEvictableIdleTimeMillis:1800000}")
private int minEvictableIdleTimeMillis;
@Value("${spring.datasource.validationQuery:SELECT 1}")
private String validationQuery;
@Value("${spring.datasource.testWhileIdle:true}")
private boolean testWhileIdle;
@Value("${spring.datasource.testOnBorrow:false}")
private boolean testOnBorrow;
@Value("${spring.datasource.testOnReturn:false}")
private boolean testOnReturn;
@Value("${spring.datasource.poolPreparedStatements:true}")
private boolean poolPreparedStatements;
@Value("${spring.datasource.filters:stat,log4j}")
private String filters;
@Value("${spring.datasource.logSlowSql:true}")
private String logSlowSql;
public DruidConfig() {
}
@Bean
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings(new String[]{"/druid/*"});
reg.addInitParameter("loginUsername", this.druidUsername);
reg.addInitParameter("loginPassword", this.druidPassword);
reg.addInitParameter("logSlowSql", this.logSlowSql);
return reg;
}
@Bean
@Primary
public DataSource druidDataSource() {
DruidDataSource datasource = new DruidDataSource();
datasource.setUrl(this.dbUrl);
datasource.setUsername(this.username);
datasource.setPassword(this.password);
datasource.setDriverClassName(this.driverClassName);
datasource.setInitialSize(this.initialSize);
datasource.setMinIdle(this.minIdle);
datasource.setMaxActive(this.maxActive);
datasource.setMaxWait(this.maxWait);
datasource.setTimeBetweenEvictionRunsMillis(this.timeBetweenEvictionRunsMillis);
datasource.setMinEvictableIdleTimeMillis(this.minEvictableIdleTimeMillis);
datasource.setValidationQuery(this.validationQuery);
datasource.setTestWhileIdle(this.testWhileIdle);
datasource.setTestOnBorrow(this.testOnBorrow);
datasource.setTestOnReturn(this.testOnReturn);
datasource.setPoolPreparedStatements(this.poolPreparedStatements);
datasource.setConnectionInitSqls(Collections.singletonList("set names utf8mb4"));
try {
datasource.setFilters(this.filters);
} catch (SQLException var3) {
log.error("druid configuration initialization filter", var3);
}
return datasource;
}
}
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。