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;
}
};
}
}