Presto 设计与实现(八):Presto JDBC
JDBC:Java Database Connectivity 是 Java 访问数据库的接口规范,访问数据库需要选择对应的 JDBC 实现。MySQL、Oracle 和 Postgresql 都有对应的 JDBC 的实现,Presto 也是如此,Presto 基于 HTTP 协议实现了 JDBC 规范,具体可参考 presto-jdbc 和 presto-client 两个模块。
JDBC
JDBC 重要接口:
DriverManager:同一个项目中可以有多个 Driver,Driver 使用之前需要向 DriverManager 注册,注册之后客户端可通过 DriverManager 获取 Driver 实例;
Driver:数据库的驱动,主要负责创建数据库的连接;
Connection:数据库的连接相当于客户端的会话,和数据库的交互基于 Connection;
Statement:用于客户端执行 SQL 语句并返回结果,客户端需要使用 Connection 获取 Statement 实例;
ResultSet:SQL 查询结果的游标,通过游标可遍历每行数据,可使用列名或查询时列的索引获取列对应的数据。
JDBC 的实现流程:
Presto JDBC
主要实现类:
PretoDriver: 定义了 Presto 驱动的版本号和自定义属性,类加载时自动向 DriverManager 注册,客户端可获取连接会话;
PrestoConnection:通过 PretoDriver 创建,同时传入 QueryExecutor,QueryExecutor 用于执行所有 SQL 查询,而 PrestoConnection 负责处理执行前的连接校验和事务处理等;
PrestoStatement:执行 SQL 查询获取查询结果,同时提供 SQL 执行过程中各种状态信息的统计;
QueryExecutor:透传 SQL 委托给 OkHttpClient 查询;
OkHttpClient: 基于 okhttp3,连接 Coodinator 发送 HTTP 查询请求。
完整处理流程:
客户端获取连接:PrestoDriver 会依次创建 OkHttpClient、QueryExecutor 和 PrestoConnection;
客户端获取的 PrestoConnection 创建 PrestoStatement,使用 PrestoStatement 执行 SQL 查询;
SQL 查询委托 QueryExecutor 查询,QueryExecutor 又将请求转发给 OkHttpClient;
OkHttpClient 发送 HTTP 查询请求给 Coordinator;
Coordinator 将 SQL 经过一系列处理最终分别为多个前后依赖的 Stage,每个 Stage 有分解为多个 RemoteTask;
RemoteTask 经过分发最终会在 Worker 节点运行;
Worker 节点启动时,PluginManager 通过 Java SPI 以插件的方式加载配置的 Connector,插件在 Presto 定义为 Plugin;
PluginManager 根据任务的 Catalog 加载具体的 Plugin;
Plugin 通过创建的 Connector 连接实际的数据库,执行逻辑查询返回数据。
版权声明: 本文为 InfoQ 作者【冰心的小屋】的原创文章。
原文链接:【http://xie.infoq.cn/article/20d0f1b4e807060916df0a807】。文章转载请联系作者。
评论