Spring Boot и Spring Cloud AWS Конфигурация источника данных

У меня есть приложение на экземпляре EC2, которое подключается к RDS (MySQL), через 8 часов соединение с БД закрывается от MySQL, и когда приложение пытается читать / записывать данные, я получаю следующее исключение

Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; 
nested exception is org.springframework.dao.DataAccessResourceFailureException: could not extract ResultSet;
nested exception is org.hibernate.exception.JDBCConnectionException: could not extract ResultSet] with root cause
java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost.

также это исключение:

Request processing failed; nested exception is
org.springframework.transaction.CannotCreateTransactionException: Could not open JPA EntityManager for transaction;
nested exception is javax.persistence.PersistenceException: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionEx
ception: No operations allowed after connection closed.] with root cause

java.net.SocketException: Connection timed out (Write failed)

это происходит через 8 часов, когда приложение работает. мой конфигурационный файл (YAML):

management:
  security:
    enabled: false
spring:
  profiles: prod
  datasource:
    tomcat:
      max-active: 20
      max-idle: 10
      min-idle: 5
      initial-size: 5
      test-while-idle: true
      test-on-borrow: true
      test-on-return: true
      validation-query: select 2 from dual
      validation-interval: 3600
      time-between-eviction-runs-millis: 5000
  jpa:
    database: MYSQL
    generate-ddl: false
    show-sql: true
    properties:
      globally_quoted_identifiers: true 
    hibernate:
      ddl-auto: none
cloud:
  aws:
    stack:
      auto: false
    region:
      static: *****
    credentials:
      instanceProfile: true
    rds:
      dev-db:
        databaseName: dev-db
        username: ******
        password: ******

Я использую:

  • Java 1.8
  • Spring boot 1.5.4.RELEASE (развертывание JAR)
  • Spring Cloud AWS JDBC и автоматическая настройка AWS, 1.1.3.RELEASE

Мое ПОМ:

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-cache</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-starter-aws-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.cloud</groupId>
            <artifactId>spring-cloud-aws-autoconfigure</artifactId>
        </dependency>

    </dependencies>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.springframework.cloud</groupId>
                <artifactId>spring-cloud-dependencies</artifactId>
                <version>Camden.RELEASE</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <repositories>
        <repository>
            <id>io.spring.repo.maven.release</id>
            <url>http://repo.spring.io/release/</url>
            <snapshots>
                <enabled>false</enabled>
            </snapshots>
        </repository>
    </repositories>

Мой вопрос:

Как настроить пул источников данных в Spring Boot для AWS (Amazon)? Я зарегистрировал конфигурацию источника данных после того, как приложение развернуто в EC2, и оно не настроено на test-while-idle и другие конфигурации, вот логи от EC2:

Data source Class Impl: class org.apache.tomcat.jdbc.pool.DataSource
 TimeBetweenEvictionRunsMillis: 5000
 ValidationInterval: 3000
 isTestOnBorrow: false
 isTestOnBorrow: false
 isTestOnBorrow: false

Я проверил эту страницу, но не могу найти способ настроить пул из файла свойств (yaml в моем случае)...

1 ответ

Я нашел обходной путь ниже, но было бы лучше поддерживать его через те же свойства автоматической настройки AWS-JDBC Spring. Я добавил ниже ( из весеннего облака AWS)

@Configuration
@EnableRdsInstance(dbInstanceIdentifier = "test",password = "secret")
public class ApplicationConfiguration {

@Bean
public RdsInstanceConfigurer instanceConfigurer() {
    return new RdsInstanceConfigurer() {
        @Override
        public DataSourceFactory getDataSourceFactory() {
            TomcatJdbcDataSourceFactory dataSourceFactory = new TomcatJdbcDataSourceFactory();
            dataSourceFactory.setInitialSize(10);
            dataSourceFactory.setValidationQuery("SELECT 1 FROM DUAL");
            dataSourceFactory.setValidationInterval(10000);
            dataSourceFactory.setTimeBetweenEvictionRunsMillis(20000);
            return dataSourceFactory;
        }
    };
}
}
Другие вопросы по тегам