Google app engine 为什么应用程序引擎(python3-标准环境)在连接到云sql-第二代Mysql实例时会生成中止的连接?
我目前正在开发一个以python 3.7、Django 2.1和Mysql作为数据库的项目 我正在谷歌云应用引擎标准环境中部署它,对于数据库,我使用的是一个云SQL-MySql第二代实例 应用程序运行良好,但是当我分析日志时,我看到以下错误: “连接中止-读取通信数据包时出错” 在这种情况下,我的应用程序(django)正在关闭连接。如果我将我的应用程序配置为具有持久连接,并且在云sql的配置中设置了等待超时(即60),则错误为: “连接中止-读取通信数据包超时” 我刚刚确定这不是sql云的问题,也不是我的应用程序配置的问题,而是应用程序引擎的问题。我是通过以下方式得出这个结论的: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云的问题
- 如果我通过Mysql workbench连接到sql云实例,则不会中止任何连接
- 类似地,如果我在本地服务器上运行我的应用程序,但连接到云sql(通过cloud\u sql\u代理),则不会生成任何错误,并且一切正常
为什么会发生这种情况?如何解决呢?我认为这是因为从应用程序引擎应用程序到云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分钟一次,也可以考虑在代码中使用语句来控制连接的生命周期。