Google Cloud Platform:在 Google Cloud SQL 中存储数据





0/5 (0投票)
Google Cloud Platform - 第 5 部分:Google Cloud SQL
- Google Cloud Platform:Google App Engine 入门(第一部分)
- Google Cloud Platform:使用 Google App Engine 进行部署(第二部分)
- Google Cloud Platform:用户管理(第三部分)
- Google Cloud Platform:移动端点(第四部分)
- Google Cloud Platform - Google Cloud SQL(第五部分)
- Google Cloud Platform - Google Cloud Datastore(第六部分)
- Google Cloud Platform - Google Cloud Storage(第七部分)
第五部分:Google Cloud SQL
再次欢迎回来。如果您刚开始收看,建议您从系列的第一部分开始,第一部分可以在此处找到。但如果您是那种喜欢在第二幕之后才进影院的人,请继续阅读——我们正在 Google Cloud Platform 上构建一个应用程序,在本期中,我们将完成大多数应用程序需要做的事情:存储数据。
Google 提供了几种数据存储方式:Google Cloud SQL,适用于希望以传统的关联数据库和模型方式存储数据的应用程序;Google Cloud Storage,用于批量数据存储;以及 Google Cloud Datastore,一个非关系型“NoSQL”数据存储系统。Google Cloud Storage 通常用于大文件存储,例如二进制文件和/或大图像,因此,它通常不是开发者以小于“文件”的原子性进行编码的对象。因此,它通常不会与Google Cloud SQL 或 Google Cloud Datastore 竞争。在这两者之间,通常存在“SQL 与 NoSQL”的意见分歧,尽管各种技术专家和布道者可能希望不同意,但没有哪一个比另一个“优越”。事实上,许多应用程序可能会发现同时使用两者(或全部三种)作为应用程序的一部分是有益的,这项技术有时被称为“多语言持久化”或“多存储”。Google Cloud SQL 有一个显著的缺点,那就是它没有免费使用层,而 Google Cloud Datastore 则有,但由于大多数生产质量的应用程序都会很快超出免费使用层,因此在两者之间的架构决策过程中,除了极少数轻度使用的情况外,实际上不应考虑这一点。
从 Java 开发者的角度来看,它们都非常直接,我们将在接下来的三期中讨论这三者。不过,总得有一个先开始,所以当您阅读第四部分时,我们在后台抛了硬币,Google Cloud SQL 赢了,所以它将是第一个介绍的。
Google Cloud SQL
在 Google Cloud Platform 中使用 Google Cloud SQL 与在传统的 JavaEE 应用程序中使用关系数据库并没有太大区别。因此,Java 开发者所了解的大部分关于 JDBC 和 JavaEE 的知识在这里都完全适用。事实上,Google Cloud SQL 本质上是在 Google 服务器上运行的 MySQL 实例,因此使用 MySQL 的大部分细节都适用于使用 Google Cloud SQL;因此,任何需要有关 Google Cloud SQL 中 SQL 具体细节(SQL-92 或 SQL-99 支持程度、模式数据类型支持等)的开发者都应该花些时间访问 MySQL 网站。运行 Google App Engine SDK 的本地应用服务器支持在本地运行 Google Cloud SQL 数据库,因此,一旦将 Google App Engine SDK 安装在开发者的机器上,实际上不需要任何其他下载(但这句话有一些细微之处,我们将在几段中看到)。
要创建 SQL 实例,请前往云中的应用程序控制台(如果您不记得了,可以在 http://cloud.google.com/console,在第二部分中,我们曾在这里创建了 Google Cloud Platform 中的应用程序端点),然后点击那里列出的项目链接。查看下一页的左侧,然后点击“Cloud SQL”。巨大的红色“新建实例”按钮的作用基本上与其名称所示一致,下一页包含重要设置,如实例大小(这直接关系到账单,请谨慎选择)和备份窗口等。一旦这些设置就绪,点击右侧的蓝色“确认”按钮,即可创建一个正在运行的 Google Cloud SQL 实例,前提是您的 Google 账户已启用账单功能。
请注意,Google Cloud Platform 有一项限制,即 Google Cloud SQL 实例必须与使用它的 Google App Engine 应用程序位于同一区域,因此如果应用程序运行在美国的服务器上,Google Cloud SQL 实例也必须运行在美国服务器上。(应用程序运行到这里有很多法律原因,其中许多是由于美国和欧盟之间不同的隐私法,更不用说美国应用程序不得不远赴欧盟获取其数据所带来的负面架构影响,因此这本身并不是一个限制。)
一旦 SQL 实例创建完成,故事基本上就变得非常熟悉,对任何 JavaEE 开发者来说都是如此:使用您选择的基于 JDBC 的持久化工具,无论是 Hibernate、JPA、iBATIS、DTO、原生 JDBC,还是(上帝保佑)您自己编写的对象/关系映射层,使用管理控制台中提供的 JDBC URL 连接到数据库,然后“进行关系操作”。如果 O/R-M 库/框架没有根据应用程序中描述的持久化类来构建模式,Google 提供了一个管理 UI(称为“SQL Prompt”),用于编写模式脚本(在 https://developers.google.com/cloud-sql/docs/sql_prompt 中介绍),或者使用 Google App Engine SDK 附带的命令行 SQL 工具“google_sql”(在 https://developers.google.com/cloud-sql/docs/commandline 中介绍)。
请注意,Google App Engine SDK 本身支持针对 Google Cloud SQL 的 JDO 和 JPA 接口,但任何其他基于 JDBC 的持久化工具都需要由开发者下载/提供。这意味着,例如,如果公司有使用 Hibernate 进行关系数据访问的企业标准,则需要下载 Hibernate JAR(针对 Hibernate 的 MySQL 版本进行调优),并将其作为 App Engine 将上传到 Google Cloud Platform 环境的 WAR 的一部分。
在本篇文章中,我将坚持使用纯 JDBC,仅仅因为它是一个“最低公分母”,并且有助于直接演示如何与 Google Cloud SQL 协同工作。任何建立在 JDBC 之上的面向关系的技术(在谈论 JVM 上运行的东西时,这几乎意味着所有技术)都可以很好地与 Google Cloud SQL 协同工作。
JDBC 连接和驱动程序
一旦在 Google Cloud Platform 控制面板中创建了 Google Cloud SQL 实例,连接到它的下一步就相当熟悉了:与任何 JDBC 应用程序一样,Java 代码需要将正确的 JDBC 驱动程序加载到 JVM 中,并使用 JDBC URL 打开连接。幸运的是,这是相当直接的 JDBC 工作;不幸的是,在本地运行或在 Google Cloud Platform 中运行时,URL 有细微差别。
String url = null; try { if (SystemProperty.environment.value() == SystemProperty.Environment.Value.Production) { // Load the class that provides the new "jdbc:google:mysql://" prefix. Class.forName("com.mysql.jdbc.GoogleDriver"); url = "jdbc:google:mysql://project-id:instance-name"; } else { // Local MySQL instance to use during development. Class.forName("com.mysql.jdbc.Driver"); url = "jdbc:mysql://127.0.0.1:3306"; } url = url + "/guestbook?user=root"; } catch (Exception e) { e.printStackTrace(); return; }
正如您所见,Google 通过无处不在的 Java“系统属性”机制,以 com.google.appengine.api.utils.SystemProperty
类为载体,提供了一种便捷的方式来确定当前运行的位置。
另请注意,URL 的末尾是一个“user=root”参数,允许应用程序以 root/管理员用户的身份登录数据库。Google Cloud SQL 实例,与大多数关系数据库系统一样,允许单独的用户/密码和安全限制,但由于 Web 应用程序或 REST 端点通常不使用这些(而是更倾向于在应用程序级别控制身份验证和授权),“root”用户简化了身份验证/授权情况。请注意,此机制依赖于 Google Cloud SQL 实例指定哪些应用程序在 App Engine 中可以访问数据库—这可以在 Google Cloud SQL 控制台中配置。(回想一下,当我们创建 SQL 实例时,它自动假定我们的 Google App Engine 应用程序实例可以访问它。)
如果您(或者更可能是您的 IT 安全部门)需要在数据库级别进行用户级别安全,可以通过 Google Cloud SQL 控制台添加,该控制台与我们之前用来配置 Google Cloud SQL 实例的控制台是同一个。在这种情况下,将使用 `DriverManager.getConnection()` 的三个参数版本传递用户及其密码,而不是通过 URL 传递。
从这里开始,故事基本上是 100% 通用的、纯粹的、无惊喜的 JDBC。
Connection conn = DriverManager.getConnection(url); String statement = "INSERT INTO entries (guestName, content)" + " VALUES( ? , ? )"; PreparedStatement stmt = conn.prepareStatement(statement); stmt.setString(1, fname); stmt.setString(2, content); int success = 2; success = stmt.executeUpdate(); // ... ResultSet rs = conn.createStatement().executeQuery( "SELECT guestName, content, entryID FROM entries"); while (rs.next()) { String guestName = rs.getString("guestName"); String content = rs.getString("content"); int id = rs.getInt("entryID"); }
对于任何企业级 Java 开发者来说,这应该是一个熟悉的基础,所以我们在这里结束故事。
摘要
Google Cloud SQL 的故事相当直接,在许多方面,这正是我们所希望的——关系数据库和 SQL 对大多数 Java 开发者来说是“已知事物”。除非有重大的优势能够带来一些截然不同的东西,否则更有意义的是“顺流而下”,利用现有的面向关系的技术。当然,这并不是说应该总是优先考虑 RDBMS 而不是其他不同“形状”的数据存储系统,例如 Google Cloud Datastore。而且,正如大多数使用 RDBMS 的开发者所知道的,尝试将二进制文件—尤其是大型二进制文件—存储到 RDBMS 中可能会非常棘手。
幸运的是,Google 提供了其他存储选项,例如 Google Cloud Datastore,这是一个非关系型数据存储系统,我们将在下一次介绍;以及 Google Cloud Storage,我们将在之后进行研究。在此期间,您可以使用一个易于使用的 RDBMS,祝您编码愉快!