多触发几次请求查询,报了connection holder is null的错误,感觉跟没用 druid的时候的connection is closed 一样的,不知道有大神帮忙分析下不
你这样提问,没人能帮到你。凭借你这几句话,没人能知道是怎么回事。
你怎么用的?怎么配置的?异常的堆栈式什么?你要复制出来。
这是pom配置文件
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.38</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
这是 yml 数据源配置:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 下面为连接池的补充设置,应用到上面所有数据源中
# 初始化大小,最小,最大
initial-size: 5
min-idle: 10
max-active: 50
# 配置获取连接等待超时的时间
max-wait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
time-between-eviction-runs-millis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-while-idle: true
test-on-borrow: false
test-on-return: false
# 打开PSCache,并且指定每个连接上PSCache的大小
pool-prepared-statements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
max-pool-prepared-statement-per-connection-size: 20
# filters: stat,wall
use-global-data-source-stat: true
我没有在代码里面写任何东西,是不是new 新的数据源啊,
错误就这个,SQL是没问题的
2020-06-11 14:51:11.283 ERROR 21505 --- [http-nio-8877-exec-1] c.a.codeService.service.TagServicelmpl : GetTagList:StatementCallback; uncategorized SQLException for SQL [select count(name) as total,name from js_tag group by name order by total desc limit 0,12;]; SQL state [null]; error code [0]; connection holder is null; nested exception is java.sql.SQLException: connection holder is null|执行的SQL:select count(name) as total,name from js_tag group by name order by total desc limit 0,12;
你jdbcTemplate哪里来的?怎么初始化的?
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
@Autowired
private JdbcTemplate jdbcTemplate;
String sql = "select count(name) as total,name from js_tag group by name order by total desc limit 0,12;";
try {
list = jdbcTemplate.query(sql, rowMapper.GetTagMapper());
} catch (Exception e) {
LOG.error("GetTagList:" + e.getMessage() + "|执行的SQL:" + sql);
}
奇怪的是我在我本地没出过个问题,用windows的服务器也没出过这种问题
你JdbcTemplate怎么初始化的?是不是了用了Druid数据源?
例如:
new JdbcTemplate(this.dataSource());
没有这样用
import org.springframework.jdbc.core.JdbcTemplate;
@Autowired
private JdbcTemplate jdbcTemplate;
直接注入
jdbcTemplate.query(sql, rowMapper.GetTagMapper());
然后开始查询
没有new druid datasource,直接用的 注入JdbcTemplate,我调试过,好像确实是 已经切换了 druid的数据源的
你先看日志,确定是不是从你配置的数据源里面获取的链接。如果不是的话,你要自己配置 JdbcTemplate
import javax.sql.DataSource;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.core.JdbcTemplate;
@Configuration
public class JdbcTemplcateConfiguration {
@Bean
public JdbcTemplate jdbcTemplate (@Autowired DataSource dataSource) {
return new JdbcTemplate(dataSource);
}
}
如果确定是从数据源获取的链接,那么你可以尝试在Druid的配置中添加下面两个配置
removeAbandoned: true
removeAbandonedTimeout: 1800
这配置的意思是
从数据源获取链接后,在
removeAbandonedTimeout
这么多秒内必须要调用close()
方法。否则就会被主动关闭。
好的,我先试试