0

我遇到了將Spring Security與由MySql數據庫支持的Elastic Beanstalk應用程序集成的問題。如果我部署我的應用程序,我可以正確登錄一段時間,但最終我會開始接收登錄錯誤而不會拋出異常,因此我無法獲得有關此問題的任何有用信息。我也下載了日誌,看不到任何有價值的東西。我可以看到日誌顯示訪問公共頁面的位置,嘗試訪問私有部分,返回登錄頁面,然後返回loginError頁面;但是,沒有任何問題。如何正確配置Elastic Beanstalk應用程序的Spring Datasource?

即使我無法通過瀏覽器登錄,我可以登錄如果我從IDE運行應用程序以及在MySQL Workbench中查看數據庫。這表明問題是由於服務器上的一些持久狀態。

我使用Spring Security的另一青苗應用之前也有類似的問題,並能夠通過設置應用程序屬性來解決它,如下所示:

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

我使用的是不是最新版本的春天該應用程序和屬性已更改爲特定的數據源,所以我嘗試將以下屬性:

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,但在我花費大量時間隨機設置和/或覆蓋默認設置之前,我想查看是否有可靠的方法來處理此問題。

如何配置我的數據源以避免長時間登錄錯誤?

回答

0

這不是特定配置值的問題,而是這些配置所在的位置。 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; 
    }; 
} 
0

以下是適用於我的設置。 來自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); 
相關問題