openGauss驱动应用程序开发流程操作指南

前言

本篇文章主要介绍JDBC的基本原理、驱动开发方法,了解原理后可以更进一步基于JDBC去访问数据库,实现应用程序开发。期望大家通过本文能够对JDBC驱动有一定的了解,并能够参与openGauss社区开发实践活动,积极探索openGauss社区、贡献openGauss社区。

一、JDBC驱动

1.1 基本介绍

JDBC( Java DataBase Connectivity ) 称为Java数据库连接,是一种访问数据库访问的标准应用程序API 。

为什么需要JDBC:不同的数据库通常会有不同的通信协议, 当一个程序使用不同的数据库时,就不得不按照厂商API写出几套连接程序;而厂商API可能在依赖操作系统功能,这将带来严重的跨平台依赖和重复代码问题。

JDBC的出现解决了这个问题,它提供了一致的编码规范,无论是哪一种数据库,在应用程序层面,都是通过一致的API去访问。

当然由于各个数据库的实现差异较大,不同的数据库驱动程序各不相同,JDBC通常由数据库厂商提供:

openGauss驱动应用程序开发流程操作指南-每日运维

1.2 标准接口

JDBC定义了一组标准的接口用于访问数据库,它们分别是数据库连接对象(Connection), 语句(Statement)以及结果集(ResultSet)。注意JDBC所有对象都必须显式的关闭,否则将造成资源泄露。它们之间的关系如下图示:连接创建语句,语句执行返回结果集。
openGauss驱动应用程序开发流程操作指南-每日运维

1.3 openGauss驱动简介

openGauss驱动是由openGauss开源社区提供的,使用Java语言编写的专用于访问openGauss数据库的驱动程序。

下载地址:https://opengauss.org/zh/download/

jdbc提供一键式编译脚本“sh build.sh”即可完成编译打包。

openGauss-jdbc已发布在maven中心仓,访问坐标如下:

openGauss驱动应用程序开发流程操作指南-每日运维

注意版本号的差别:自3.1.0版本开始,均会提供带"-og"后缀的版本,它们的功能完全一致,差别点是否与pg驱动共存,如:

"3.1.0"的版本中,jar包内的包名为org.postgresql,它可以完全替换pg驱动类,但是它不可与pg驱动共存。

"3.1.0-og"版本中,jar包内的包名为org.opengauss,它可以与pg数据库驱动包共存。

1.4 小结

以上内容是关于JDBC的介绍,让大家了解了JDBC的作用,同时也可以掌握openGauss社区的jdbc开源地址、发布包等内容,为下一步的驱动开发做好准备。

二、openGauss驱动原理

2.1 基本介绍

openGauss-jdbc在是TCP/IP 协议之上实现了一套基于消息的通信协议。主要包括以下内容:

  • 建立和取消连接的消息流

  • 通信协议中使用的消息格式和类型

  • 处理请求的消息流

  • Copy 子协议

  • 批量插入子协议

openGauss驱动应用程序开发流程操作指南-每日运维

openGauss 是多线程架构,守护线程 Postmaster 为每个连接分配一个后台线程(backend),后台线程的分配是在协议处理之前进行的,每个后台进程自行负责协议的处理。在 openGauss 源码或者文档中,通常认为 ‘backend’ 和 ‘server’ 是等价的,表示服务端;同样,‘frontend’ 和 ‘client’ 是等价的,表示客户端(应用程序)。

2.2 认证协议介绍

openGauss-jdbc通信协议包括两个阶段:startup和normal。startup阶段主要完成客户端与数据库认证连接,正常则连接成功进入normal阶段。normal阶段客户端完成SQL命令的请求和数据库的响应。

startup是非通用消息,会将协议版本号和客户端连接的用户名、数据库和GUC参数发送给数据库,而normal阶段则使用通用的消息格式:

openGauss驱动应用程序开发流程操作指南-每日运维

startup阶段认证过程如下:

openGauss驱动应用程序开发流程操作指南-每日运维
  • auth request消息(13字节):R 4字节(长度) 4字节(认证协议) 4字节(随机盐值)

  • PasswordMesage消息: p 4字节(长度) 36字节(35字节md5密码+\0)

  • ParameterStatus消息(包括server_version,client_edcoding和DataStyle): S 4字节(长度) key\0value\0

  • BackendKeyData消息(13字节): K 4字节(长度) 4字节(pid码) 4字节(ckey)

  • ReadyForQuery消息(6字节): Z 4字节(长度) 1字节(状态码I->idle, T->事务中, E->出现错误)

  • copy-out 导出数据,对应命令 COPY TO STDOUT

  • copy-both 用于 walsender,在主备间批量传输数据