我只是在学习Google App Engine,并试图想出一个很好的方法来管理我与Google Cloud SQL实例的数据库连接(如果你还没有使用GC-SQL,基本上,它是云中的MySQL,有一些限制).
我正在使用带有webapp2框架的python(2.7)GAE环境来处理请求.我知道常见问题解答说,建议每次请求都要与DB建立新的连接,但我不知道建议的关闭连接的方法是什么.每次我尝试在开发过程中删除表时,GC-SQL挂起并且"show processlist"显示有一堆进程(可能是因为我没有关闭数据库)并且其中一个正在等待锁定(可能是这个过程试图放弃表格).这很烦人,迫使我重新启动GC-SQL实例(比如重新启动mysql-server服务,我想).我还认为偶尔存在数据库打嗝,这与我没有真正关闭数据库连接这一事实有关.
那么,例如,我的webapp2.Requesthandler子类实例上是否应该有一个析构函数来断开与DB的连接?GAE对象有时似乎被缓存,所以这也是需要考虑的事情.我想我可以为每个查询连接/查询/断开连接,但这似乎不是最理想的.
我知道这是一个模糊的问题,但我希望在这个领域有所作为的人可以按我的方式提出一些提示.
提前致谢!
更新: 我尝试使用Shay的答案作为起点,围绕需要cursot的方法实现一个包装器.我收到了GAE错误.以下是一个特定于此的新问题:App Engine中Google Cloud SQL的连接限制是什么,以及如何最好地重用数据库连接?
我使用app引擎创建了一个java web servlet,servlet向数据库发出请求.我已经使用本地数据库在本地测试了servlet并且它工作得很好,然后我继续在本地测试servlet但是仍然访问了Cloud SQL数据库,这也很有效.
在部署servlet之后我的问题出现了.部署完所有数据库请求后返回以下内容:
com.mysql.jdbc.exceptions.jdbc4.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.
Run Code Online (Sandbox Code Playgroud)
我在云控制台中查看,我的应用程序已正确添加到访问控制选项卡下的云SQL授权应用程序引擎应用程序中.
是否有人在部署的应用引擎servlet上遇到过类似的问题?那里有任何解决方案或建议吗?我将不胜感激任何帮助!
更新:
使用以下代码生成上述错误以访问db
Class.forName("com.mysql.jdbc.Driver");
Url = "jdbc:mysql://<ip-address-cloudsql>:3306/<dbname>";
Connection con = DriverManager.getConnection (Url,"root",<password>);
Run Code Online (Sandbox Code Playgroud)
使用此代码实现了同样的错误,请注意它与此处示例中显示的代码非常相似https://developers.google.com/appengine/docs/java/cloud-sql/
Class.forName("com.mysql.jdbc.GoogleDriver");
Url = "jdbc:google:mysql://<appID:instanceID>/<dbname>?
user=root&password=<password>";
Connection con = DriverManager.getConnection (Url);
Run Code Online (Sandbox Code Playgroud)
当我使用appid和实例id来设置url时,我按照此stackoverflow文章中的格式化提示显示: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:
使用此代码导致以下不同的错误:
java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)
Run Code Online (Sandbox Code Playgroud)
我假设它说localhost因为我的cloudsql数据库设置为遵循app引擎servlet.另外,要知道这两种方法在本地运行servlet和访问cloud sql数据库时都能正常工作.
有什么想法吗?我不知道还有什么可以尝试:[
我刚刚创建了一个Google Cloud SQL实例.当我查看我的实例的访问控制时,我发现如果我想访问我的数据库,我应该授权我的IP地址获得访问数据库的权限,但问题是我的应用程序将被部署在任何地方客户需要,即使我知道他们将运行应用程序的位置以及我授权他们的IP地址,它(IP)将每24小时更改一次,因为它不是静态IP,然后我必须一次又一次地重新授权IP!
有没有办法让实例可以从任何IP访问?
谢谢
我有一个Google App Engine应用程序,它使用Google Cloud SQL实例存储数据.我需要我的实例能够通过休息调用一次为数百个客户端提供服务,每个客户端都会产生一个或几个数据库查询.我已经包装了需要DB访问的方法,并将句柄存储到os.environ中的DB连接.看看这个问题/答案基本上我是怎么做的.
但是,只要有几百个客户端连接到我的应用程序并触发数据库调用,我就会在Google App Engine错误日志中开始收到这些错误(当然,我的应用程序返回500):
could not connect: ApplicationError: 1033 Instance has too many concurrent requests: 100 Traceback (most recent call last): File "/base/python27_run
Run Code Online (Sandbox Code Playgroud)
Google App Engine和Google Cloud SQL的有经验用户提供的任何提示?提前致谢.
这是我使用需要DB连接的方法的装饰器的代码:
def with_db_cursor(do_commit = False):
""" Decorator for managing DB connection by wrapping around web calls.
Stores connections and open connection count in the os.environ dictionary
between calls. Sets a cursor variable in the wrapped function. Optionally
does a commit. Closes the cursor when wrapped method …Run Code Online (Sandbox Code Playgroud) 我的团队要求我们能够检索数据库的备份(托管在Google Cloud SQL上)并将该数据库恢复到本地托管的MySQL实例.
我知道Google Cloud SQL能够安排备份,但这些备份似乎无法在任何地方下载.
我也知道我们能够将我们的数据库"导出"到Google云端存储,但我们希望能够安排"导出".
这里的最终目标是在某种管理脚本中执行以下步骤:
有任何想法吗?
每当我尝试设置root密码时,我都会收到一条消息"实例忙".
我如何设置实例的密码?是否有第三方工具可用于连接到cloud-sql实例并可能从那里设置密码?
我在Google App Engine应用程序上有一个Django应用程序,它使用App Engine身份验证连接到Google Cloud SQL .
大多数情况下一切正常,但有时会引发以下异常:
OperationalError: (2013, "Lost connection to MySQL server at 'reading initial communication packet', system error: 38")
Run Code Online (Sandbox Code Playgroud)
根据文档,在以下情况下返回此错误:
例如,如果Google Cloud SQL拒绝连接,则因为客户端连接的IP地址未经授权.
在我的情况下这没有多大意义,因为身份验证是由App Engine服务器完成的.
什么可能导致这些零星的错误?
我已经能够在开发人员控制台中成功创建Google容器群集,并将我的应用程序部署到它.这一切都很好,但我发现我无法连接到Cloud SQL,我得到;
"Error: Handshake inactivity timeout"
Run Code Online (Sandbox Code Playgroud)
经过一番挖掘,我从App Engine或本地机器连接到数据库时没有遇到任何问题,所以我觉得这有点奇怪.那时我注意到集群权限......
当我选择我的群集时,我看到以下内容;
Permissions
User info Disabled
Compute Read Write
Storage Read Only
Task queue Disabled
BigQuery Disabled
Cloud SQL Disabled
Cloud Datastore Disabled
Cloud Logging Write Only
Cloud Platform Disabled
Run Code Online (Sandbox Code Playgroud)
我真的希望在我的容器引擎节点中同时使用云存储和云端SQL.我允许在我的项目设置中访问每个API,我的Cloud SQL实例正在接受来自任何IP的连接(我之前在App Engine上的托管虚拟机中运行过Node),所以我的想法是Google明确禁用这些API.
所以我的两部分问题是;
任何帮助非常感谢!
node.js google-cloud-storage google-cloud-sql google-cloud-platform google-kubernetes-engine
目前,我已经在谷歌应用引擎上部署了我的django项目.我需要运行python manage.py migrate命令,以便auth_user在我的google云实例上创建表.但是不知道在哪里运行这个命令.
当我用kubernetes运行图像时,我正在创建一个连接到cloudql数据库的容器.它没有可用于允许新映像连接到数据库的外部IP.但由于这是init配置的一部分,我迫不及待想知道要添加到白名单数据库的公共IP是什么.
我知道这是通过同一群集中的服务连接数据库的方法,但我无法弄清楚如何连接谷歌提供的cloudsql.