当前位置: 首页 > 知识库问答 >
问题:

AWS Aurora无服务器spring boot通信链路错误

锺离明煦
2023-03-14

我正在做一个原型,以移动我们的spring boot为基础的应用程序到AWS极光数据库,包括无服务器模式。 使用Provisioned模式,事情会按预期工作。 但是,在无服务器模式下,应用程序无法从EC2实例连接到DB,异常情况如下:

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.

我已经尝试减少初始池大小等,但仍然得到相同的错误

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
....

当我将Datasource更改为SimpleDataSource或从EC2实例运行一个简单的Java jdbc连接时,它就会工作。

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

对于spring boot JPA/JDBC应用程序,这种情况正常吗? 我们必须使用SimpledRiverDataSource吗? 也许我们更应该使用https://docs.aws.amazon.com/amazonrds/latest/aurorauserguide/data-api.html? 这可能需要重写很多与DB相关的代码。

共有1个答案

管峻
2023-03-14

在无服务器模式下,尽管使用一个随时可用的实例的警告池进行了高度优化,但您的应用程序需要一段时间才能真正连接到Aurora。

因此,很可能在应用程序启动时,到数据库的连接还不可用。

对于您的错误跟踪,似乎您正在尝试执行某种DDL操作,可能是因为您正在使用hbm2ddl创建或验证数据库模式,并且该操作需要在应用程序启动时连接。

为了支持这种数据库体系结构,您可以缓慢地初始化bean(在实体管理器和Hibernate的情况下,这可能是基石),或者寻找生成DDL的替代方法,如Liquibase(尽管我认为问题仍然存在)。

您可以尝试调整您的Hikari连接参数。 例如,本文提出了一个巧妙的配置,并提供了对AWS Aurora的深入了解:

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

我唯一不明白的是,为什么您的代码与SimpledRiverDataSource一起工作:也许它提供了一些默认值,允许您的应用程序从一开始就没有错误地连接到Aurora。

 类似资料:
  • 我有两个AWS EC2实例。服务器和客户端节点JS应用程序。 在本地,我的代码运行良好。但是在AWS,客户端会在一段时间后(例如30秒)关闭,没有任何警告/异常(由于某种原因,它无法找到并连接到服务器) 两个AWS实例都在运行:Windows Server 2016 Base。 两个AWS实例都有自己的服务器“AWS安全组”。只是为了确保我没有阻止两个安全组当前允许的任何东西:“所有流量到任何IP

  • 我用java从MySQL查询了一些记录。但是在一些查询中,我遇到了一个问题,使查询失败,但在其他情况下,它查询成功。错误消息是下一个: 我尝试过一些方法,比如: 在 但什么都没发生。 我的环境是: MySQL: 5.5.3-m3-log源代码分布 Java: 1.60_16 jdk: HotSpot(TM)64位服务器VM(构建14.2-b01,混合模式) JDBC: mysql连接器-java-

  • Web主要围绕HTTP的请求/响应范例构建。客户端加载网页,然后在用户点击下一页之前没有任何操作。大约在2005年,AJAX开始让网络感觉更有活力。仍然,所有HTTP通信都由客户端引导,这需要用户交互或定期轮询以从服务器加载新数据。 使服务器能够在知道新数据可用的瞬间将数据发送到客户端的技术已存在很长时间了。它们的名称如“Push”或“Comet”。 将套接字引入Web Websocket规范定义

  • 我在Stackoverflow的另一个问题中尝试了这个建议,并在连接方面做了如下更改 但我的项目还是失败了 严重:执行身份验证com时发生异常。mysql。jdbc。例外情况。jdbc4。通信异常:通信链路故障 谁能告诉我克服这个问题的最好方法是什么?

  • 我试图连接我的java应用程序与SQL数据库和当我点击保存按钮它给我以下错误 这是我的密码

  • 我想写一个非常简单的API。当我使用邮差API时。我想创建android应用程序,但我的应用程序崩溃了。为什么?哪里是错误

  • 我实际上在研究微服务,我面临一个问题。 上下文 我正在开发两个微服务: 用户管理,基于spring,使用MySQL数据库 计划管理,基于ASP.NET与SQL Server数据库。此服务的唯一访问点是列出一些RESTFULendpoint的API,如 计费管理,基于MongoDB的node.js。 问题 > 我该怎么做才能只允许通过用户服务访问规划信息,而不耦合这两个服务?知道以后可以从其他地方访

  • 在Openshift中,我有两个需要彼此通信的服务,我想知道您是否知道一种方法来做到这一点,而不公开这两个微服务。 示例: 服务A需要在服务B上请求一个endpoint,为此,我正在使用DNS,但要做到这一点,我需要公开服务B。 有什么方法可以在不公开服务B的情况下完成此场景? 要公开服务A,我运行命令:“oc expose Service/servicea”