关系数据库服务(RDS)(Relational Database Service (RDS))
Amazon RDS 可用于在云中设置和运行关系数据库。它支持多种数据库实例类型以及多个数据库引擎,如 Amazon Aurora、PostgreSQL、MySQL、MariaDB、Oracle 数据库和 SQL Server。本周我们将使用 Amazon Aurora 创建一个无服务器 MySQL 数据库。Amazon Aurora 是免费的。
我们可以从 AWS 管理控制台找到 RDS 主页。页面如下所示。
我们点击“创建数据库”按钮。这会带我们到一个长页面,在那里我们可以创建和配置数据库集群。
我们选择以下选项,而不更改大多数默认选项。
- 在“选择数据库创建方法”下选择“标准创建”。
- 在“引擎选项”部分,将“引擎类型”更改为“Aurora(MySQL 兼容)”。我们将使用基于 MySQL 的引擎。
- 在“可用版本”中,我们选择一个旧版本,使用 MYSQL v5.x.y.z。
- “模板”选择“生产”。
- 在“设置”部分,为“数据库集群标识符”命名,在本例中为“database-1”。
- 然后我们提供用户名(“admin”)和密码。
- “集群存储配置”应选择“Aurora 标准”。
- 在“实例配置”中,我们选择“突发类”,然后选择“db.t3.small”,以便配置一个较小的虚拟机。
- “可用性和持久性”选择默认选项。
- 在“连接”部分,保持所有默认选择不变。这包括 - “不连接到 EC2 计算资源”、“IPv4”、“默认 VPC”、默认子网组、不公开访问、“现有”VPC 防火墙、“默认”VPC 安全组。
- 我们保持“数据库身份验证”选择“密码身份验证”。
- 非常重要:取消选中“启用增强监控”。否则在创建此数据库时会出现错误。
- 在“其他配置”部分,可以为“初始数据库名称”提供数据库名称,为“scudb”。或者,如果愿意,可以跳过此步骤,稍后使用命令创建数据库。
- 我们不需要保留数据库备份,因此取消选中“备份”部分的“将标签复制到快照”选项。
- 非常重要:在“删除保护”部分取消选中“启用删除保护”选项。我们这样做是因为需要在完成后删除 RDS 数据库实例。RDS 是一个高计算资源,消耗大量信用。如果不删除 RDS 实例,我们很快会耗尽信用。
- 最后点击“创建数据库”按钮。我们会被带到下面的页面。在数据库准备和创建之前可能需要一些时间。
我们可以看到两个实例 - 写入和读取。读取实例是只读的,写入实例用于读写。如果我们点击“数据库标识符”下的“写入实例”,在“连接和安全”选项卡下,我们将看到以下详细信息。我们需要记下“端点和端口”信息,以备后用。
配置 RDS 数据库
我们还没有完成,我们需要在创建 Java 应用之前配置 RDS 数据库和 Cloud9 之间的映射。要做到这一点,请按照以下步骤操作。
我们需要使用另一个服务“VPC”来配置映射。可以通过在 AWS 管理控制台页面上搜索找到此服务。
从“VPC”控制台,我们点击左侧菜单上的“安全组”。我们通常会看到两个安全组 - 一个用于 RDS 集群,另一个用于 Cloud9 环境。可以从“描述”选项卡中双重检查。
我们需要复制 Cloud9 安全组的“安全组 ID”。
然后点击 RDS 集群的安全组。在“入站规则”下,点击“编辑入站规则”按钮。
然后点击“添加规则”。在“类型”列表中选择“MYSQL/Aurora”,并将复制的安全组 ID 粘贴到“来源”文本框中。点击“保存规则”按钮。
要测试连接,我们进入 Cloud9 环境(与其映射的环境)并在终端中输入以下命令。
打开一个新终端并输入以下命令,以检查映射是否成功。
mysql --user=[你的主用户名] --password=[你的密码] -h [你的数据库端点]
在本例中,这是:
mysql --user=admin --password=12345678 -h database-1.cluster-cb3hgqshailb.us-east-1.rds.amazonaws.com
如果连接成功,我们会看到如下确认消息。MySQL 终端将打开,可以在其中运行 SQL 命令。
运行 SQL 命令
登录 MySQL 终端后,可以运行任何类型的 SQL 命令。例如,我们想查看现有数据库的列表。可以运行以下命令,并会看到数据库列表。请注意,SQL 命令以分号(;)结束。
可以使用以下两个命令创建新数据库并列出现有数据库:
create database scudb;
show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| scudb |
+--------------------+
4 rows in set (0.00 sec)
可以使用以下命令选择要使用的数据库:
use scudb;
可以使用以下命令创建表:
create table units(id int primary key not null, name text not null, credit int not null);
可以通过以下命令检查表列表,表“units”应出现在列表中:
show tables;
使用 Java 访问 RDS
对于 MySQL,我们需要在 pom.xml 中使用以下依赖项。
<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.6</version>
</dependency>
需要在 App.java 中添加以下类。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
在 main 方法中使用以下代码在我们的“scudb”数据库中创建一个新表(Units)。创建 Connection 和 Statement 实例。我们需要提供一个 JDBC URL、用户名和密码来创建数据库连接。JDBC URL 的格式如下:
jdbc:mysql:// [主机或端点] : [端口] / [数据库名称]
主程序中的源码如下。我们将运行一个 SQL 查询来插入表:units(id, name, credit)。在数据库连接和执行查询之前,我们必须加载 MySQL 的类驱动程序(即‘com.mysql.jdbc.Driver’)。createStatement() 方法准备查询,executeUpdate() 方法执行该查询。
Connection c = null;
Statement stmt = null;String endpoint = "database-1.cluster-cb3hgqshailb.us-east-1.rds.amazonaws.com";
String port = "3306";
String dbname = "scu_test_db";
String url = "jdbc:mysql://" + endpoint + ":" + port + "/" + dbname;
String username = "admin";
String password = "12345678";try {Class.forName("com.mysql.jdbc.Driver");c = DriverManager.getConnection(url, username, password);stmt = c.createStatement();String sql = "insert into units(id, name, credit) values(1, 'Programming II', 4);";stmt.executeUpdate(sql);stmt.close();c.close();} catch (Exception e) {System.err.println(e.getClass().getName()+": "+ e.getMessage());System.exit(0);
}
为了确认插入,如果我们在 Cloud9 终端中运行选择查询,我们应该会看到以下输出。
MySQL [scudb]> select * from units;
+----+----------------+--------+
| id | name | credit |
+----+----------------+--------+
| 1 | Programming II | 4 |
+----+----------------+--------+
1 row in set (0.01 sec)
更新和删除条目非常简单,只需替换查询语句。使用以下源代码。executeUpdate() 方法用于插入、删除和更新项目。
sql = "update units set name=’NEW_NAME’ where id=1";
stmt.executeUpdate(sql);sql = "delete from units where id=1";
stmt.executeUpdate(sql);
从 RDS 数据库读取项目稍有不同。我们需要使用 ResultSet 类和 executeQuery() 方法。
import java.sql.ResultSet;sql = "select name from units where id=1";
ResultSet res = stmt.executeQuery(sql);while(res.next()) {System.out.println(res.getString("name"));
}