App端调用springboot接口频繁报超时
2018-03-20 15:15
429 查看
用的mybatis,mysql连接池采用druid。
修改如下配置,发现效果不大
2.继续琢磨,怀疑数据库连接池频繁调用失效连接,修改如下之后,发现效果改善
3.但是还是时不时报超时,因为我每个接口调用了登录token验证,而token是存放redis之中的,由此怀疑redis的错误。然后回去看redis的配置
然后把redis的事务关了就正常了…具体原因还在研究ing…
修改如下配置,发现效果不大
#默认1000ms hystrix.command.default.execution.isolation.thread.timeoutInMilliseconds=10000
2.继续琢磨,怀疑数据库连接池频繁调用失效连接,修改如下之后,发现效果改善
# jdbc_config datasource spring.datasource.url= jdbc:mysql://127.0.0.1:3306/datebook?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull spring.datasource.username= root spring.datasource.password= root spring.datasource.driverClassName= com.mysql.jdbc.Driver spring.datasource.type= com.alibaba.druid.pool.DruidDataSource #druid_config # 初始化连接,最小空闲连接, 最大连接数量 spring.datasource.initialSize=5 spring.datasource.minIdle=5 spring.datasource.maxActive=15 #超时等待时间 毫秒为单位 spring.datasource.maxWait=60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 spring.datasource.timeBetweenEvictionRunsMillis=60000 spring.datasource.removeAbandoned=true sp 4000 ring.datasource.removeAbandonedTimeout=1800 # 配置一个连接在池中最小生存的时间 毫秒为单位 spring.datasource.minEvictableIdleTimeMillis=300000 #SQL查询,用来验证从连接池取出的连接,在将连接返回给调用者之前.如果指定,则查询必须是一个SQL SELECT并且必须返回至少一行记录 spring.datasource.validationQuery=SELECT 1 FROM DUAL #指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 spring.datasource.testWhileIdle=true #指明是否在从池中取出连接前进行检验,如果检验失败,则从池中去除连接并尝试取出另一个.注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 spring.datasource.testOnBorrow=false #指明是否在归还到池中前进行检验注意: 设置为true后如果要生效,validationQuery参数必须设置为非空字符串 spring.datasource.testOnReturn=false # 打开PSCache,并且指定每个连接上PSCache的大小 开启池的prepared statement 池功能 spring.datasource.poolPreparedStatements: true spring.datasource.maxPoolPreparedStatementPerConnectionSize=20 spring.datasource.logAbandoned=true # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙 spring.datasource.filters= stat,wall,slf4j # 通过connectProperties属性来打开mergeSql功能;慢SQL记录 spring.datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=3000 # 合并多个DruidDataSource的监控数据 #spring.datasource.useGlobalDataSourceStat=true
import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.support.http.StatViewServlet; import com.alibaba.druid.support.http.WebStatFilter; import org.springframework.beans.factory.annotation.Value; 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 org.springframework.context.annotation.Primary; import javax.sql.DataSource; import java.sql.SQLException; import java.util.HashMap; import java.util.Map; @Configuration public class DruidConfiguration { @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.removeAbandoned}") private boolean removeAbandoned; @Value("${spring.datasource.removeAbandonedTimeout}") private int removeAbandonedTimeout; @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.logAbandoned}") private boolean logAbandoned; @Value("${spring.datasource.filters}") private String filters; @Value("${spring.datasource.connectionProperties}") private String connectionProperties; @Bean public ServletRegistrationBean druidServlet() { ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new StatViewServlet()); servletRegistrationBean.addUrlMappings("/druid/*");//http://localhost:8090/datebook/druid/login.html Map<String, String> initParameters = new HashMap<>(); initParameters.put("resetEnable", "false"); //禁用HTML页面上的“Rest All”功能 initParameters.put("allow", ""); //ip白名单(没有配置或者为空,则允许所有访问) initParameters.put("deny", "10.8.9.116"); //ip黑名单 initParameters.put("loginUsername", "admin"); //++监控页面登录用户名 initParameters.put("loginPassword", "admin"); //++监控页面登录用户密码 //如果某个ip同时存在,deny优先于allow servletRegistrationBean.setInitParameters(initParameters); return servletRegistrationBean; } @Bean //声明其为Bean实例 @Primary //在同样的DataSource中,首先使用被标注的DataSource public DataSource druidDataSource() { DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl(this.dbUrl); druidDataSource.setUsername(username); druidDataSource.setPassword(password); druidDataSource.setDriverClassName(driverClassName); //configuration druidDataSource.setInitialSize(initialSize); druidDataSource.setMinIdle(minIdle); druidDataSource.setMaxActive(maxActive); druidDataSource.setMaxWait(maxWait); druidDataSource.setRemoveAbandoned(removeAbandoned); druidDataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout); druidDataSource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis); druidDataSource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis); druidDataSource.setValidationQuery(validationQuery); druidDataSource.setTestWhileIdle(testWhileIdle); druidDataSource.setTestOnBorrow(testOnBorrow); druidDataSource.setTestOnReturn(testOnReturn); druidDataSource.setPoolPreparedStatements(poolPreparedStatements); druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize); try { druidDataSource.setFilters(filters); } catch (SQLException e) { e.printStackTrace(); } druidDataSource.setLogAbandoned(logAbandoned); druidDataSource.setConnectionProperties(connectionProperties); return druidDataSource; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
3.但是还是时不时报超时,因为我每个接口调用了登录token验证,而token是存放redis之中的,由此怀疑redis的错误。然后回去看redis的配置
@Bean public RedisTemplate<String, Object> redisTemplate(JedisConnectionFactory jedisConnectionFactory ) { //设置序列化 Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); //配置redisTemplate RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>(); redisTemplate.setConnectionFactory(jedisConnectionFactory); RedisSerializer stringSerializer = new StringRedisSerializer(); redisTemplate.setKeySerializer(stringSerializer);//key序列化 redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);//value序列化 redisTemplate.setHashKeySerializer(stringSerializer);//Hash key序列化 redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);//Hash value序列化 redisTemplate.afterPropertiesSet(); //redisTemplate.setEnableTransactionSupport(true);//结果发现是这里开启了redis事务 return redisTemplate; }
然后把redis的事务关了就正常了…具体原因还在研究ing…
相关文章推荐
- springboot + retrofit(平台间接口调用)
- Spring-Boot ☞ ShapeFile文件读写工具类+接口调用
- spring boot中用RabbitMQ调用接口
- Spring-Boot -- RESTFUL风格的API接口的三种调用方式【测试】
- spring boot下接口调用失败重试方案
- 使用Spring特性实现接口多实现类的动态调用
- 构建 Zookeeper + Dubbo + Spring Boot 的分布式调用项目(一)
- Spring Boot 实例通过接口安全退出
- spring-boot实战【10】【转】:Spring Boot中使用@Async实现异步调用
- springboot-swagger2 Restful接口文档的形成
- SpringBoot框架中REST接口的异常处理方法
- SpringBoot Activiti6.0 使用SharedExecutorServiceAsyncExecutor无法触发timer job 超时的问题
- Spring Boot普通类调用bean
- 【Spring Cloud】Feign接口调用
- 【Spring Cloud】Feign接口调用
- Spring Boot 中使用Feign作为HTTP客户端调用远程HTTP服务
- Spring Boot中使用@Async实现异步调用
- 通过springcloud-gateway调用后台服务超时的问题
- 构建 Zookeeper + Dubbo + Spring Boot 的分布式调用项目(二)
- 基于HttpClient实现RPC远程服务调用【SpringBoot项目】