金仓数据库KingbaseES JDBC介绍
关键字:
KingbaseES、接口、JDBC、人大金仓
客户端编程接口介绍
接口泛指实体把自己提供给外界的一种抽象化物(可以为另一实体),用以由内部操作分离出外部沟通方法,使其能被修改内部而不影响外界其他实体与其交互的方式。
数据库接口实际上是一类软件,它用于将用户的请求行为翻译成数据库能够理解的特殊内容并交给数据库执行;也将数据库中返回给应用的数据内容翻译成应用能够理解的格式。这个翻译的依据就是数据库的通信协议。
数据库接口一般是宿主语言(java, c, php, etc. )的开发库,也就是一系列 API 的集合。这些 API 集合了从数据用户身份验证、数据库查询、数据操作、数据库对象定义修改等几乎数据库的所有操作。应用程序通过API形成事务来数据库中的数据。从应用程序的角度,事务处理主要通过主动和自动两种模式来管理:
- 当使用自动提交模式时,每个 SQL 语句都被当作一个完整的事务,在 SQL 语句成功执行之后,每个事务都自动提交。
- 当使用手动提交模式时,会在应用程序首次访问一个数据源时隐式地开始事务,在调用提交或回滚事务操作接口,显式地结束事务。如果没有此时没有显示结束事务,那么连接断开会自动回滚当前会话事务。
事务回滚级别:从应用程序角度,事务的回滚都是针对于手动提交模式。回滚级别主要有以下两种:
- 事务级回滚:一个事务中,如果应用程序发送的执行语句序列中有语句执行出错,应用需要在出错语句执行后,显示回滚并结束整个事务。如果继续执行,则需要重新开始一个新事务。
- 语句级回滚:一个事务中,如果应用程序发送的执行语句序列中有语句执行出错,接口自动回滚出错的语句,不会回滚整个事务(事务中的第一条语句出错除外)。
带占位符的SQL:一类通用做法,基本所有驱动中都能看到类似的行为。比如JDBC通过问号表示占位符,OCI通过冒号名字等等。 最初的目的是防止SQL注入,提高安全性;同时也为某个SQL重复执行参数不同时缓存计划,提升性能;也支持函数存储过程调用时的参数传递。
JDBC
JDBC(Java DataBase Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。 总体而言,JDBC包含以下几大角色 : Driver、DriverManager、Connection、Statement、ResultSet。
Connection 表示与特定数据库的连接,可以获取到数据库的一些信息,这些信息包括:其表信息,应该支持的SQL语法,数据库内有什么存储过程,此链接功能的信息等等。
Statement 的功能在于根据传入的sql语句,将传入sql经过整理组合成数据库能够识别的sql语句(对于静态的sql语句,不需要整理组合;而对于预编译sql语句和批量语句,则需要整理),然后传递sql请求,之后会得到返回的结果。对于查询sql,结果会以ResultSet的形式返回。
ResultSet 对象是sql语句查询的结果,作为数据库结果的映射,其映射关系如下图所示。ResultSet对从数据库返回的结果进行了封装,使用迭代器的模式逐条取出结果集中的记录。
JDBC的工作流程如下:
- 加载特定数据库驱动器实现类,并注册驱动器(Driver会注册到DriverManager中)
- 根据特定的URL,返回可以接受此URL的数据库驱动对象Driver
- 使用数据库驱动 Driver 创建数据库连接Connection会话
- 使用 Connection对象创建 用于操作sql的Statement对象
- statement对象 .执行 sql语句,返回结果ResultSet 对象
- 处理ResultSet中的结果
- 关闭连接,释放资源
Jdbc3PoolingDataSource 类是实现了 DataSource 接口的数据库连接池的管理类。 使用 Jdbc3PoolingDataSource 类可以提高程序的运行效率。建立数据库连接将耗费大量的资源,而把连接放到池中,可以节省大量的建立新连接的开销。
Jmeter
Jmeter是一款用于压力测试的工具,通过GUI可以以低代码的方式快速编写其专用脚本,并对数据库集群下发业务压力。脚本的编写方式如下:
- 配置线程组:线程组元件是任何一个测试计划的开始点,在一个测试计划中的所有元件都必须在线程组下。所有的任务都是基于线程组。
- 线程组:一个线程组里面有若干个请求;
- 线程:一个线程就是一个“虚拟用户”
- 配置连接池:从提供的JDBC连接配置创建数据库连接(由JDBC RequestSampler使用)。连接可以选择在线程之间进行池化。否则每个线程都有自己的连接。JDBC采样器使用连接配置名称来选择适当的连接。使用的池是DBCP。
- 配置采样器
- 配置监视器
SQL语句处理方式
接口在处理SQL语句时有简单查询协议以及扩展查询协议,具体如下:
简单查询协议:发送查询串,分析,执行。发送报文时序相对简单,只需要Query(Q) 即可;返回报文时序包含:RowDescription(T) -> DataRow(D) ->CommandComplete(C) -> ReadyForQuery(Z) (有结果集或无结果集) 。
扩展查询协议的流程包括:发送查询串,分析,绑定,执行。其中发送报文时序包含:Parse(P)->Bind(B)->Describe(D)->Execute(E)->Sync(S) ;有结果集时返回报文时序为:ParseComplete(1) -> BindComplete(2) -> RowDescription(T) -> DataRow(D) -> CommandComplete(C) -> ReadyForQuery(Z);无结果集时返回报文时序为:ParseComplete(1) -> BindComplete(2) -> NoData(n) -> CommandComplete(C) -> ReadyForQuery(Z)。
JDBC读写分离
读写分离原理:KES 提供主备集群的高可用机制,JDBC驱动基于此提供透明的读写分离功能,让应用无缝的从单机迁移到读写分离集群上,提供透明的查询负载均衡和故障转移。
通过JDBC驱动自动识SQL别语句读写种类,写语句发给主机,分发读语句到备机,从而实现读写分离。
通过让主数据库(Primary)处理写事务:增、改、删等操作(INSERT、UPDATE、DELETE),而从数据库(Standby)分担处理读事务SELECT查询操作,从而提升集群对外整体处理性能。 读写分离的策略包括最大一致以及最大性能等;其中最大一致性策略(策略1): 规避异步备库的时延造成的主备数据不一致情况,事务中的语句全都只发往主机;而最大性能策略(策略2): 事务中写语句之前那的读语句可以分发所有备机或只发同步备机,从写语句开始只发往主机。默认选择策略2,以最大化性能提升。




