Google app engine 为什么应用程序引擎(python3-标准环境)在连接到云sql-第二代Mysql实例时会生成中止的连接?

Google app engine 为什么应用程序引擎(python3-标准环境)在连接到云sql-第二代Mysql实例时会生成中止的连接?,google-app-engine,google-cloud-platform,google-cloud-sql,Google App Engine,Google Cloud Platform,Google Cloud Sql,我目前正在开发一个以python 3.7、Django 2.1和Mysql作为数据库的项目 我正在谷歌云应用引擎标准环境中部署它,对于数据库,我使用的是一个云SQL-MySql第二代实例 应用程序运行良好,但是当我分析日志时,我看到以下错误: “连接中止-读取通信数据包时出错” 在这种情况下,我的应用程序(django)正在关闭连接。如果我将我的应用程序配置为具有持久连接,并且在云sql的配置中设置了等待超时(即60),则错误为: “连接中止-读取通信数据包超时” 我刚刚确定这不是sql云的问题

我目前正在开发一个以python 3.7、Django 2.1和Mysql作为数据库的项目

我正在谷歌云应用引擎标准环境中部署它,对于数据库,我使用的是一个云SQL-MySql第二代实例

应用程序运行良好,但是当我分析日志时,我看到以下错误:

“连接中止-读取通信数据包时出错”

在这种情况下,我的应用程序(django)正在关闭连接。如果我将我的应用程序配置为具有持久连接,并且在云sql的配置中设置了等待超时(即60),则错误为:

“连接中止-读取通信数据包超时”

我刚刚确定这不是sql云的问题,也不是我的应用程序配置的问题,而是应用程序引擎的问题。我是通过以下方式得出这个结论的:

  • 如果我通过Mysql workbench连接到sql云实例,则不会中止任何连接
  • 类似地,如果我在本地服务器上运行我的应用程序,但连接到云sql(通过cloud\u sql\u代理),则不会生成任何错误,并且一切正常
因此,我的结论是,这是一个应用程序引擎如何连接到云sql实例的问题


为什么会发生这种情况?如何解决呢?

我认为这是因为从应用程序引擎应用程序到云SQL的请求受到以下时间和连接的限制:

  • 对于在App Engine标准环境中运行的应用程序,所有数据库请求必须在HTTP请求计时器(约60秒)内完成。对于在灵活环境中运行的应用程序,所有数据库请求必须在60分钟内完成
  • 像cron任务这样的脱机请求有10分钟的时间限制
  • 根据应用程序引擎模块的缩放类型以及实例在内存中的保留时间(驻留),对云SQL的请求具有限制
  • 在标准环境中运行的每个应用程序引擎实例与云SQL实例的并发连接不能超过60个。对于用Java 8或Go 1.8编写的应用程序,限制为100
  • 如果您看到包含“中止连接nnnn到db:”的错误,通常表示您的应用程序未正确终止连接。它也可能是由网络问题引起的。此错误并不意味着您的云SQL实例存在问题
您看到的“中止连接”消息通常在连接关闭不当或服务器与客户端之间出现网络异常时触发

  • 有时,云SQL实例和GAE具有长期闲置连接。为了解决此问题,建议将“”标志设置为低于600秒,因为您已经尝试过这样做

  • 另一种可能的解决方案是实现应用程序级keepalives。SQLAlchemy为此提供了“”。否则,通过发送简单的SQL语句(如“SELECT 1;“至少每隔5分钟一次,也可以考虑在代码中使用语句来控制连接的生命周期。


我还没有尝试池化。但是我认为解决方案不应该是为此进行池化。解决方案应该是默认情况下应用程序引擎连接到数据库而不生成这些错误。@Ale我已经使用Django运行了一个示例GAE应用程序,并将其连接到云SQL,但只能看到少数此类错误-您能分享吗重现您遇到的问题所需的最少代码?我相信这将有助于确定问题的根本原因。您使用的是哪种mysql驱动程序?我以前使用过Mysqlclient并切换到PyMySQL,错误大大减少。但是我仍然怀疑为什么会产生这些错误(因为仍然会出现一些错误)?应用程序引擎不应该能够干净地关闭所有连接?我运行了当前使用PyMySQL 0.9.3的示例GAE Django应用程序。错误可能是由于未管理连接造成的;正如您前面所说,建议避免这些错误的方法是连接池,因为应用程序引擎是一个运行您的代码的环境,所以它不会管理这样的事情。