【问题标题】:How to properly configure Spring Datasource for an Elastic Beanstalk app?如何为 Elastic Beanstalk 应用程序正确配置 Spring Datasource?
【发布时间】:2017-01-17 23:23:02
【问题描述】:

我在将 Spring Security 与由 MySql 数据库支持的 Elastic Beanstalk 应用程序集成时遇到了问题。如果我部署我的应用程序,我可以在一段时间内正确登录,但最终我会开始收到登录错误,而不会引发异常,因此我无法获得有关该问题的任何有用信息。我也下载了日志,看不到任何有价值的东西。我可以看到日志显示访问公共页面的位置,尝试访问私有部分,返回登录页面,然后是 loginError 页面;但是,没有任何问题。

即使我无法通过浏览器登录,如果我从 IDE 运行应用程序并在 MySQL Workbench 中查看数据库,我也可以登录。这表明我的问题是由于服务器上的一些持久状态。

我之前在使用 Spring Security 的另一个 Beanstalk 应用程序中遇到过类似的问题,并且能够通过如下设置应用程序属性来解决它:

spring.datasource.test-on-borrow=true
spring.datasource.validation-query=SELECT 1

我使用的是比该应用程序更新的 Spring 版本,并且属性已更改为特定数据源,因此我尝试添加以下属性:

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.validation-query=SELECT 1

当这不起作用时,我根据此处类似问题的答案添加了另一个;现在的属性是:

spring.datasource.tomcat.test-on-borrow=true
spring.datasource.tomcat.test-while-idle=true
spring.datasource.tomcat.validation-query=SELECT 1

这似乎有效(可能是由于登录活动较少),但最终导致了相同的行为。

我已经研究了各种 properties available,但在我花费大量时间随机设置和/或覆盖默认设置之前,我想看看是否有可靠的方法来处理这个问题。

如何配置我的数据源以避免长时间后出现登录错误?

【问题讨论】:

    标签: spring-mvc tomcat spring-security amazon-elastic-beanstalk amazon-rds


    【解决方案1】:

    以下是对我有用的设置。 来自Connection to Db dies after >4<24 in spring-boot jpa hibernate

    dataSourceFactory.setMaxActive(10);
    dataSourceFactory.setInitialSize(10);
    dataSourceFactory.setMaxIdle(10);
    dataSourceFactory.setMinIdle(1);
    dataSourceFactory.setTestWhileIdle(true);
    dataSourceFactory.setTestOnBorrow(true);
    dataSourceFactory.setValidationQuery("SELECT 1 FROM DUAL");
    dataSourceFactory.setValidationInterval(10000);
    dataSourceFactory.setTimeBetweenEvictionRunsMillis(20000); 
    dataSourceFactory.setMinEvictableIdleTimeMillis(60000);
    

    【讨论】:

      【解决方案2】:

      这不是特定配置值的问题,而是这些配置所在的位置。 application.properties (/resources; Intellij) 的默认位置可以很好地部署为带有嵌入式 Tomcat 服务器的 jar,但不能作为与提供的服务器的战争。该文件未找到/未使用,因此对文件的更改不会影响 AWS 提供的文件。

      有很多方法可以处理这个问题;我选择在我的SpringBootServletInitializer 中添加一个 RDS 配置 bean:

      @Bean
      public RdsInstanceConfigurer instanceConfigurer() {
          return () -> {
              TomcatJdbcDataSourceFactory dataSourceFactory =
                      new TomcatJdbcDataSourceFactory();
              // Abondoned connections...
              dataSourceFactory.setRemoveAbandonedTimeout(60);
              dataSourceFactory.setRemoveAbandoned(true);
              dataSourceFactory.setLogAbandoned(true);
              // Tests
              dataSourceFactory.setTestOnBorrow(true);
              dataSourceFactory.setTestOnReturn(false);
              dataSourceFactory.setTestWhileIdle(false);
              // Validations
              dataSourceFactory.setValidationInterval(30000);
              dataSourceFactory.setTimeBetweenEvictionRunsMillis(30000);
              dataSourceFactory.setValidationQuery("SELECT 1");
              return dataSourceFactory;
          };
      }
      

      【讨论】:

        猜你喜欢
        • 2021-11-20
        • 2013-11-25
        • 2017-04-19
        • 2018-04-14
        • 2014-01-11
        • 2014-07-21
        • 2012-11-25
        • 2014-09-25
        • 2017-08-07
        相关资源
        最近更新 更多