AWS Ошибка канала связи при загрузке бессерверной загрузки Aurora Serverless - PullRequest
0 голосов
/ 01 августа 2020

Я делаю прототип для переноса нашего приложения на основе Spring Boot в AWS Aurora DB, включая бессерверный режим. В режиме Provisioned все работает должным образом. Однако в бессерверном режиме приложение не может подключиться к БД из экземпляра EC2, за исключением:

org.springframework.beans.factory.BeanCreationException: 
Error creating bean with name 'entityManagerFactory' defined in class path resource 
[org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: 
Invocation of init method failed; nested exception is javax.persistence.PersistenceException: 
[PersistenceUnit: default] Unable to build Hibernate SessionFactory; 
nested exception is org.hibernate.exception.JDBCConnectionException: 
Unable to open JDBC Connection for DDL execution

.....

Caused by: com.mysql.cj.jdbc.exceptions.CommunicationsException: 
Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. 
The driver has not received any packets from the server.

Я попытался уменьшить начальный размер пула et c, но все равно получаю ту же ошибку

spring.datasource.url=jdbc:mysql://xxxxxx.cluster-xxxxxxxxxx.us-east-1.rds.amazonaws.com:3306/db_example
spring.datasource.username=xxxx
spring.datasource.password=xxxxxxx
spring.datasource.hikari.maximum-pool-size=1
spring.datasource.hikari.minimum-idle=0
spring.datasource.hikari.connection-timeout=60000
spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect
....

Когда я меняю источник данных на SimpleDataSource или запускаю простое java jdb c соединение из экземпляра EC2, оно работает.

@Bean("dataSource")
public DataSource dataSource() {
  SimpleDriverDataSource dataSource = new SimpleDriverDataSource();
  ....
}     

Это нормально при загрузке Spring JPA / JDB C Приложение? Обязательно ли использовать SimpleDriverDataSource? Возможно, нам лучше использовать https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/data-api.html? Вероятно, это потребует переписывания большого количества кода, связанного с БД.

1 Ответ

2 голосов
/ 01 августа 2020

В бессерверном режиме, несмотря на высокую оптимизацию с помощью пула предупреждений, готовых к go экземплярам, ​​вашему приложению требуется некоторое время, прежде чем вы сможете подключиться к Aurora.

По этой причине это очень вероятно, что при запуске приложения соединение с базой данных еще не доступно.

Кажется, что для трассировки вашей ошибки вы пытаетесь выполнить какую-то операцию DDL, вероятно, потому что вы используете hbm2ddl для создания или проверки схемы базы данных, и для этой операции требуется соединение только во время запуска приложения.

Чтобы поддерживать этот тип архитектуры базы данных, вы можете лениво инициализировать свои bean-компоненты (что в случае entity Manager и Hibernate могут быть краеугольным камнем), или поищите альтернативный подход для генерации DDL, такой как Liquibase (хотя я думаю, что проблема останется).

Вы можете попробовать настроить параметры подключения Hikari. Например, в этой статье предлагается продуманная конфигурация и дается отличное представление о AWS Aurora:

https://silexdata.com/modern-applications-and-aws-aurora-serverless/

Единственное, что я не понимаю, это почему ваш код работает с SimpleDriverDataSource: возможно, он предоставляет некоторые значения по умолчанию, которые позволяют вашему приложению подключаться к Aurora без ошибок с самого начала.

...