基本概念、连接方式与第一个 Indievow 程序
数据库(Database)
数据库是按数据结构来组织、存储和管理数据的仓库。数据库下包括若干表、索引,以及数据库对象的元数据信息。
表(Table)
最基本的数据库对象,Indievow的表都是关系表。每个表由若干行记录组成,每一行有相同的预先定义的列。用户通过SQL语句对表进行增、删、查、改等操作。通常,表的若干列会组成一个主键,主键在整个表的数据集合内唯一。
分片(Tablet)
Indievow会把一个Table按照主键范围切分成若干个相邻的Tablet,并将 Tablet 分配到不同的 DG上存储。Tablet是数据库内部负载均衡和复制迁移的基本单位,Tablet的默认大小是64M,默认存储3个副本,多个副本均衡的分布在不同DG上。
计算引擎(CG)
Indievow数据库集群的入口,使用MySQL通信协议,所有的SQL都发到CG,由CG负责SQL解析,生成执行计划,分发执行计划,并返回执行结果。
存储引擎(DG)
存储和管理Tablet,提供数据查询服务。
事务引擎(TG)
基于LSM-Tree架构的内存事务处理引擎,负责事务相关操作,如锁管理、redo log等,保障事务的ACID特性,基于多版本并发控制协议(MVCC)实现Read Committed事务隔离级别。
管理引擎(MG)
管理集群内所有的节点,通过心跳感知节点的上下线;维护Tablet的分布信息,并管理Tablet的副本数量、复制、迁移和合并。
前提条件
已安装Indievow数据库并拥有账户/密码:
假设CG的IP地址为“192.168.1.7”,端口号为“2880”,用户名为“admin”,密码为“admin”。
命令行登陆
mysql -h192.168.1.7 -P2880 -uadmin -padmin
参数说明
-h:CG所在服务器的IP地址;
-P:启动CG服务命令-z参数所指定的MySQL协议服务端口;
-u:Indievow数据库用户名,admin为预置超级用户;
-p:Indievow数据库用户的密码,admin用户的缺省密码为admin
在应用服务器外使用JDBC时,DriverManager类将用于管理连接的建立。
需要告诉DriverManager应与哪个JDBC驱动建立连接。完成该任务的最简单方法是:在实施了java.sql.Driver接口的类上使用Class.forName()。对于MySQL Connector/J,该类的名称是com.mysql.jdbc.Driver。采用该方法,可使用外部配置文件来提供连接到数据库时将使用的驱动类名和驱动参数。
在下面的Java代码中,介绍了在应用程序的main()方法中注MySQLConnector/J的方式:
在DriverManager中注册了驱动后,通过调用DriverManager.getConnection(),能够获得与数据库相连的连接实例。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
public class JDBCTest {
public static void main(String[] args) throws Exception {
Connection connection = null;
PreparedStatement prepareStatement = null;
ResultSet rs = null;
try {
// 加载驱动
Class.forName("com.mysql.jdbc.Driver");
// 获取连接
String url = "jdbc:mysql://192.168.100.202:2880/testdb";
String user = "admin";
String password = "admin";
connection = DriverManager.getConnection(url, user, password);
// 获取statement,preparedStatement
String sql = "select * from users where id=?";
prepareStatement = connection.prepareStatement(sql);
// 设置参数
prepareStatement.setLong(1, 1l);
// 执行查询
rs = prepareStatement.executeQuery();
// 处理结果集
while (rs.next()) {
System.out.println(rs.getString("userName"));
System.out.println(rs.getString("name"));
System.out.println(rs.getInt("age"));
System.out.println(rs.getDate("birthday"));
}
} finally {
// 关闭连接,释放资源
if (rs != null) {
rs.close();
}
if (prepareStatement != null) {
prepareStatement.close();
}
if (connection != null) {
connection.close();
}
}
}
}