如何为 Elastic Beanstalk 应用程序正确配置 Spring Datasource?

Posted

技术标签:

【中文标题】如何为 Elastic Beanstalk 应用程序正确配置 Spring Datasource?【英文标题】:How to properly configure Spring Datasource for an Elastic Beanstalk app? 【发布时间】: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,但在我花费大量时间随机设置和/或覆盖默认设置之前,我想看看是否有可靠的方法来处理这个问题。

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

【问题讨论】:

【参考方案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;
    ;

【讨论】:

以上是关于如何为 Elastic Beanstalk 应用程序正确配置 Spring Datasource?的主要内容,如果未能解决你的问题,请参考以下文章

如何为 Django 应用程序将 Amazon Elastic Beanstalk Linux 1 升级到 Linux 2

如何为 RDS 配置 Elastic Beanstalk

如何为 ruby​​ 2.7.1 解决 AWS Elastic Beanstalk 上的 Rail 6 部署错误

如何为 Elastic Beanstalk 配置 Laravel?

如何为我的 Elastic Beanstalk 单实例配置 SSL

如何为 Elastic Beanstalk DOCKER 环境设置永久 DNS 名称?