征象:
接口请求,10秒钟超时,看了一下,是sql查询耗时太长了,数据还没来得及返回,连接就断开了。
连接断开,上层应用直接报错。。
这些问题,都是。。。知道答案后,就觉得,emmm,好简单。知道答案前,…tmd, 这啥玩意儿。。。。
直接说答案吧:
数据库连接超时,那就设置超时时长,精确地说是 druid 的超时时长。。。
要设置 druid 的 connectTimeout 、socketTimeout 这两个设置项,
嗯。单这样说,有点。。。
一份druid 设置
- druid:
- url: jdbc:mysql://10.12.1.9:3306/student?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
- username: username
- password: passwordxxxx
- useSSL: false
- initial-size: 50
- min-idle: 50
- max-active: 200
- connectTimeout: 600000 #1.2.12版本需要单独配置才生效
- socketTimeout: 600000 #1.2.12版本需要单独配置才生效
复制代码 有了设置,不够,需要在代码内里解析设置
于是要写一个:
DruidProperties.java
尚有 DruidAutoConfiguration.java
- import com.alibaba.druid.pool.DruidDataSource;
- import com.alibaba.druid.support.http.StatViewServlet;
-
- import javax.sql.DataSource;
- import java.sql.SQLException;
-
- /**
- * Created by chu on 2017/3/2.
- */
- @Configuration
- @EnableConfigurationProperties(DruidProperties.class)
- @ConditionalOnClass(DruidDataSource.class)
- @ConditionalOnProperty(prefix = "druid", name = "url")
- @AutoConfigureBefore(DataSourceAutoConfiguration.class)
- public class DruidAutoConfiguration {
-
- @Autowired
- private DruidProperties properties;
- /**
- * 获取数据源
- * @return DataSource
- */
- @Bean
- public DataSource dataSource() {
- DruidDataSource dataSource = new DruidDataSource();
- dataSource.setUrl(properties.getUrl());
- dataSource.setUsername(properties.getUsername());
- dataSource.setPassword(properties.getPassword());
- if (properties.getInitialSize() > 0) {
- dataSource.setInitialSize(properties.getInitialSize());
- }
- if (properties.getMaxActive() > 0) {
- dataSource.setMaxActive(properties.getMaxActive());
- }
- if (properties.getMaxWait() > 0) {
- dataSource.setMaxWait(properties.getMaxWait());
- }
- if (properties.getMinIdle() > 0) {
- dataSource.setMinIdle(properties.getMinIdle());
- }
- if (properties.getValidationQuery() != null) {
- dataSource.setValidationQuery(properties.getValidationQuery());
- }
- if (properties.getConnectTimeout() > 0) {
- dataSource.setConnectTimeout(properties.getConnectTimeout());
- }
- if (properties.getSocketTimeout() > 0) {
- dataSource.setSocketTimeout(properties.getSocketTimeout());
- }
- dataSource.setTestOnBorrow(properties.isTestOnBorrow());
-
- try {
- dataSource.init();
- } catch (SQLException e) {
- throw new RuntimeException(e);
- }
- return dataSource;
- }
-
- /**
- * 获取ServletRegistrationBean
- * @return ServletRegistrationBean
- */
- @Bean
- public ServletRegistrationBean druidServlet() {
- ServletRegistrationBean druidServletRegistration = new ServletRegistrationBean(new DruidStatViewServlet());
- druidServletRegistration.addInitParameter("allow", "127.0.0.1");
- druidServletRegistration.addUrlMappings("/druid/*");
- return druidServletRegistration;
- }
-
- }
复制代码 一开始,设置文件写到了
- spring:
- datasource:
- druid:
- connectTimeout: 600000 #1.2.12版本需要单独配置才生效
- socketTimeout: 600000 #1.2.12版本需要单独配置才生效
复制代码 然后设置死活不生效。。。
呃,,,, 所以设置文件,息争析类的前缀肯定要匹配才行噢! 不认识的同学,其实很容易踩坑。。。。
我就踩了很多多少次。。。emmmm
踩坑记录:单独设置:socketTimeout: 600000不生效,需要两项同时设置:
- connectTimeout: 600000 #1.2.12版本需要单独配置才生效
- socketTimeout: 600000 #1.2.12版本需要单独配置才生效
复制代码 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |