0


【Druid】数据库连接超时

现象:
接口请求,10秒钟超时,看了一下,是sql查询耗时太长了,数据还没来得及返回,连接就断开了。
连接断开,上层应用直接报错。。

这些问题,都是。。。知道答案后,就觉得,emmm,好简单。知道答案前,…tmd, 这啥玩意儿。。。。

直接说答案吧:
数据库连接超时,那就配置超时时长,准确地说是 druid 的超时时长。。。
要设置 druid 的 connectTimeout 、socketTimeout 这两个配置项,
嗯。单这样说,有点。。。

一份druid 配置

  1. druid:
  2. url: jdbc:mysql://10.12.1.9:3306/student?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true
  3. username: username
  4. password: passwordxxxx
  5. useSSL: false
  6. initial-size: 50
  7. min-idle: 50
  8. max-active: 200
  9. connectTimeout: 600000 #1.2.12版本需要单独配置才生效
  10. socketTimeout: 600000 #1.2.12版本需要单独配置才生效

有了配置,不够,需要在代码里面解析配置
于是要写一个:
DruidProperties.java

  1. import org.springframework.boot.context.properties.ConfigurationProperties;
  2. /**
  3. * druid
  4. */
  5. @ConfigurationProperties(prefix = "druid")
  6. public class DruidProperties {
  7. private String url;
  8. private String username;
  9. private String password;
  10. private int initialSize;
  11. private int minIdle;
  12. private int maxActive;
  13. private long maxWait;
  14. private String validationQuery;
  15. private int connectTimeout;
  16. private int socketTimeout;
  17. private boolean testOnBorrow;
  18. public String getUrl() {
  19. return url;
  20. }
  21. public void setUrl(String url) {
  22. this.url = url;
  23. }
  24. public String getUsername() {
  25. return username;
  26. }
  27. public void setUsername(String username) {
  28. this.username = username;
  29. }
  30. public String getPassword() {
  31. return password;
  32. }
  33. public void setPassword(String password) {
  34. this.password = password;
  35. }
  36. public int getInitialSize() {
  37. return initialSize;
  38. }
  39. public void setInitialSize(int initialSize) {
  40. this.initialSize = initialSize;
  41. }
  42. public int getMinIdle() {
  43. return minIdle;
  44. }
  45. public void setMinIdle(int minIdle) {
  46. this.minIdle = minIdle;
  47. }
  48. public int getMaxActive() {
  49. return maxActive;
  50. }
  51. public void setMaxActive(int maxActive) {
  52. this.maxActive = maxActive;
  53. }
  54. public long getMaxWait() {
  55. return maxWait;
  56. }
  57. public void setMaxWait(long maxWait) {
  58. this.maxWait = maxWait;
  59. }
  60. public String getValidationQuery() {
  61. return validationQuery;
  62. }
  63. public void setValidationQuery(String validationQuery) {
  64. this.validationQuery = validationQuery;
  65. }
  66. public int getConnectTimeout() {
  67. return connectTimeout;
  68. }
  69. public void setConnectTimeout(int connectTimeout) {
  70. this.connectTimeout = connectTimeout;
  71. }
  72. public int getSocketTimeout() {
  73. return socketTimeout;
  74. }
  75. public void setSocketTimeout(int socketTimeout) {
  76. this.socketTimeout = socketTimeout;
  77. }
  78. public boolean isTestOnBorrow() {
  79. return testOnBorrow;
  80. }
  81. public void setTestOnBorrow(boolean testOnBorrow) {
  82. this.testOnBorrow = testOnBorrow;
  83. }
  84. }

还有 DruidAutoConfiguration.java

  1. import com.alibaba.druid.pool.DruidDataSource;
  2. import com.alibaba.druid.support.http.StatViewServlet;
  3. import javax.sql.DataSource;
  4. import java.sql.SQLException;
  5. /**
  6. * Created by chu on 2017/3/2.
  7. */
  8. @Configuration
  9. @EnableConfigurationProperties(DruidProperties.class)
  10. @ConditionalOnClass(DruidDataSource.class)
  11. @ConditionalOnProperty(prefix = "druid", name = "url")
  12. @AutoConfigureBefore(DataSourceAutoConfiguration.class)
  13. public class DruidAutoConfiguration {
  14. @Autowired
  15. private DruidProperties properties;
  16. /**
  17. * 获取数据源
  18. * @return DataSource
  19. */
  20. @Bean
  21. public DataSource dataSource() {
  22. DruidDataSource dataSource = new DruidDataSource();
  23. dataSource.setUrl(properties.getUrl());
  24. dataSource.setUsername(properties.getUsername());
  25. dataSource.setPassword(properties.getPassword());
  26. if (properties.getInitialSize() > 0) {
  27. dataSource.setInitialSize(properties.getInitialSize());
  28. }
  29. if (properties.getMaxActive() > 0) {
  30. dataSource.setMaxActive(properties.getMaxActive());
  31. }
  32. if (properties.getMaxWait() > 0) {
  33. dataSource.setMaxWait(properties.getMaxWait());
  34. }
  35. if (properties.getMinIdle() > 0) {
  36. dataSource.setMinIdle(properties.getMinIdle());
  37. }
  38. if (properties.getValidationQuery() != null) {
  39. dataSource.setValidationQuery(properties.getValidationQuery());
  40. }
  41. if (properties.getConnectTimeout() > 0) {
  42. dataSource.setConnectTimeout(properties.getConnectTimeout());
  43. }
  44. if (properties.getSocketTimeout() > 0) {
  45. dataSource.setSocketTimeout(properties.getSocketTimeout());
  46. }
  47. dataSource.setTestOnBorrow(properties.isTestOnBorrow());
  48. try {
  49. dataSource.init();
  50. } catch (SQLException e) {
  51. throw new RuntimeException(e);
  52. }
  53. return dataSource;
  54. }
  55. /**
  56. * 获取ServletRegistrationBean
  57. * @return ServletRegistrationBean
  58. */
  59. @Bean
  60. public ServletRegistrationBean druidServlet() {
  61. ServletRegistrationBean druidServletRegistration = new ServletRegistrationBean(new DruidStatViewServlet());
  62. druidServletRegistration.addInitParameter("allow", "127.0.0.1");
  63. druidServletRegistration.addUrlMappings("/druid/*");
  64. return druidServletRegistration;
  65. }
  66. }

一开始,配置文件写到了

  1. spring:
  2. datasource:
  3. druid:
  4. connectTimeout: 600000 #1.2.12版本需要单独配置才生效
  5. socketTimeout: 600000 #1.2.12版本需要单独配置才生效

然后配置死活不生效。。。

呃,,,, 所以配置文件,和解析类的前缀一定要匹配才行噢! 不熟悉的同学,其实很容易踩坑。。。。

我就踩了好多次。。。emmmm
踩坑记录:单独配置:

  1. socketTimeout: 600000

不生效,需要两项同时配置:

  1. connectTimeout: 600000 #1.2.12版本需要单独配置才生效
  2. socketTimeout: 600000 #1.2.12版本需要单独配置才生效
标签: 数据库 java

本文转载自: https://blog.csdn.net/ok060/article/details/137742735
版权归原作者 ok060 所有, 如有侵权,请联系我们删除。

“【Druid】数据库连接超时”的评论:

还没有评论