写点什么

Presto 设计与实现(八):Presto JDBC

作者:冰心的小屋
  • 2023-08-25
    北京
  • 本文字数:968 字

    阅读完需:约 3 分钟

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 查询请求。

完整处理流程:

  1. 客户端获取连接:PrestoDriver 会依次创建 OkHttpClient、QueryExecutor 和 PrestoConnection;

  2. 客户端获取的 PrestoConnection 创建 PrestoStatement,使用 PrestoStatement 执行 SQL 查询;

  3. SQL 查询委托 QueryExecutor 查询,QueryExecutor 又将请求转发给 OkHttpClient;

  4. OkHttpClient 发送 HTTP 查询请求给 Coordinator;

  5. Coordinator 将 SQL 经过一系列处理最终分别为多个前后依赖的 Stage,每个 Stage 有分解为多个 RemoteTask;

  6. RemoteTask 经过分发最终会在 Worker 节点运行;

  7. Worker 节点启动时,PluginManager 通过 Java SPI 以插件的方式加载配置的 Connector,插件在 Presto 定义为 Plugin;

  8. PluginManager 根据任务的 Catalog 加载具体的 Plugin;

  9. Plugin 通过创建的 Connector 连接实际的数据库,执行逻辑查询返回数据。

发布于: 刚刚阅读数: 3
用户头像

分享技术上的点滴收获! 2013-08-06 加入

一杯咖啡,一首老歌,一段代码,欢迎做客冰屋,享受编码和技术带来的快乐!

评论

发布
暂无评论
Presto 设计与实现(八):Presto JDBC_冰心的小屋_InfoQ写作社区