摘要:使用Java语言进行各类应用程序的快速开发成为目前比较主要且流行的开发方式。JDBC是 Java 语言中用来连接和操作关系型数据库的 API,在业务程序与关系型数据库通信时,必然会使用JDBC驱动。
本文将通过国产关系型数据库AntDB中的JDBC为大家着重介绍JDBC如何在关系型数据库中发挥驱动作用,同时向大家展示AntDB在JDBC驱动方面的创新特性。
关键字:JDBC,双引擎语法,安全加强,批量更新
JDBC简介
JDBC是Java数据库连接(Java Database Connectivity),一套操作数据库的规范接口。这套规范接口,经过多次版本迭代,目前使用最多的规范接口是JDBC4.x。关于JDBC规范相关的说明,请参考本文后续中的参考资料章节。
AntDB中JDBC的使用方式
AntDB的JDBC驱动是基于开源数据库PostgreSQL数据库的JDBC驱动进行的二次开发,因此,大部分使用方式与PostgreSQL的使用方式相同。为了区分与PostgreSQL的区别,AntDB的URL中支持两种连接方式:
-jdbc:postgresql://ip:port/dbname,这种方式是AntDB最初提供的驱动中使用的连接方式,为了兼容PostgreSQL的使用习惯,因此进行了保留;
-jdbc:antdb://ip:port/dbname,这种方式是目前AntDB主推的连接方式,用于区分AntDB与其他数据库的连接方式。
例如:
String url = "jdbc:antdb://10.1.1.1:6655/antdb?grammar=oracle";
String user = "user";
String password = "xxxx";
Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
conn.setAutoCommit(false);
PreparedStatement psmt = conn.prepareStatement("insert into test1 values(?,'abc')");
for(int i = 1; i <= 10; i ++){
psmt.setInt(1,i);
psmt.execute();
}
conn.commit();
psmt.close();
conn.close();
}catch (SQLException ex)
{
System.out.println(ex.getMessage());
}finally {
if(conn != null) {
conn.close();
}
}
AntDB的JDBC新特性
AntDB支持Oracle和PostgreSQL双存储引擎,并且可以进行在会话级存储引擎的动态调整。因此,AntDB在JDBC驱动层进行了双引擎的适配开发。目前AntDB的JDBC支持如下两种方式进行双引擎支持。
- 物理连接级支持
通过在JDBC的URL中指定参数’grammar’来对物理连接使用的语法进行控制。可指定为:
oracle
例如:
jdbc:antdb://10.1.1.1:6655/antdb?grammar=oracle;此时,通过该URL创建的物理连接的默认使用的是Oracle语法,用户可以使用Oracle的相关语法对AntDB进行相关的数据操作。
postgres
例如:
jdbc:antdb://10.1.1.1:6655/antdb?grammar=postgres;此时,通过该URL创建的物理连接的默认使用的是PostgreSQL语法,用户可以使用PostgreSQL的相关语法对AntDB进行相关的数据操作。
- 会话级支持
在用户SQL执行之前,通过JDBC提供的接口execute/executeQuery来执行’set grammar=xxx’,其中xxx可为:
oracle
该SQL执行之后,该会话后续执行的所有SQL,都可以使用Oracle语法进行后续的数据操作。
postgres
该SQL执行之后,该会话后续执行的所有SQL,都可以使用PostgreSQL语法进行后续的数据操作。
- 服务实例级支持
通过在AntDB中执行如下SQL,就可以将服务实例的语法统一进行修改:
alter system set grammar to oracle ;
select pg_reload_conf();
目前AntDB内核层面支持scram-sha-256、md5、password等口令认证方式(具体参见参考资料部分),而客户端的JDBC只能支持md5和password两种口令认证方式。考虑到scram-sha-256是目前提供的方法中最安全的一种口令认证方式,特此,AntDB对JDBC驱动进行了该认证方式的适配。
使用最新版的AntDB的JDBC驱动(下载地址:http://www.antdb.net/download)即可使用上述的任意一种认证方式。
JDBC4的规范中,提供了一类批量处理的规范接口:addBatch/executeBatch/clearBatch等,通过使用这些接口,可以降低应用程序(APP)与数据库的通信次数,大幅降低网络压力,提升业务的处理性能。
例如,批量删除表t中的数据1~100,通过一次网络通信,来删除数据库中的相应行记录。
PreparedStatement psmt = conn.prepareStatement("delete from t where c1=?");
for(int i = 1; i <= 100; i ++){
psmt.setInt(1,i);
psmt.addBatch();
}
psmt.executeBatch()
上述例子中,通过网络抓包发现,上述的100次删除操作,应用程序只与数据库进行了一次通信:
上述处理中,APP通过批量更新特性,一个批次删除了数据库中100条记录,由于减少了网络通信的次数,利用数据库服务端的处理能力,大幅提升了批量删除的性能。但是,目前的AntDB数据库服务端接收到合并在一起的多个参数时,会逐个进行解析,然后一条一条执行(开源PostgreSQL也是同样的处理逻辑)。
该执行效率比较低下,在大数据量删除的场合下,影响数据的删除效率。基于该背景,AntDB对JDBC驱动进行了优化。通过在JDBC的URL中指定如下参数,可批量对数据库进行删除,大幅提升删除的效率。
-reWriteBatchedDeletes=true时,jdbc驱动内部会改写SQL,将上述SQL会改写成:delete from t1 where id in (1,2,3...)
-reWriteBatchedDeleteSize指定时,改写后的SQL会按照指定的批次进行删除,例如reWriteBatchedDeleteSize设置为3时,改写后的SQL就以3为单位,对所有数据分批执行,例如,'delete from t1 where id in (1,2,3)','delete from t1 where id in (4,5,6)'......
通过该优化,AntDB的JDBC驱动的批量删除性能得到大幅提升(例如,指定为10000时,性能提示150倍左右)。
图1 AntDB中DELETE性能优化效果
为了支撑Oracle语法环境下的一些数据类型,目前AntDB的Oracle语法环境下,JDBC驱动对如下的Oracle数据类型进行了适配,通过该适配,Oracle语法下对下述数据类型进行操作时就同Oracle的JDBC操作方式保持一致,不需要额外进行转换。
-varchar2
-nvarchar2
-rowid
-oracle.date
-raw
同时,在支持上述数据类型时,为了考虑与开源框架的支持(例如,mybatis),AntDB的JDBC驱动中对如下接口也进行了强化(开源PostgreSQL这些接口将直接抛出异常)。
- CallableStatement.getNString(int)
- PreparedStatement.setNString(int, String)
- ResultSet.getNString(int)
- ResultSet.getNString(String)
AntDB后续优化思路
目前的AntDB的JDBC已经能够满足大部分业务的应用场景,但也有一部分内部实现没有完全支持JDBC4.x规范,会抛出异常(开源PostgreSQL也存在类似问题)。后续的话,根据业务需要,会对这部分接口进行强化。例如:
-PreparedStatement.setNClob
-CallableStatement.getNClob
-ResultSet.getNClob
-PreparedStatement.setNCharacterStream
-CallableStatement.getNCharacterStream
-ResultSet.getNCharacterStream
-Etc.
参考资料
JDBC specification参考:
-JDBC 4.1 Specification (JDBC 4.1). Available at https://download.oracle.com/otndocs/jcp/jdbc-4_1-mrel-spec/index.html
- JDBC 4.0 Specification (JDBC 4.0). Available at http://jcp.org/en/jsr/detail?id=221
- JDBC 3.0 Specification (JDBC 3.0). Available at http://jcp.org/en/jsr/detail?id=54
-JDBC 2.1 API (JDBC 2.1). Available at http://www.oracle.com/technetwork/java/download-141179.html
- JDBC 2.0 Standard Extension API (JDBC extension specification). Available at http://www.oracle.com/technetwork/java/download-141179.html
-JDBC 1.22 API (JDBC 1.22). Available at http://www.oracle.com/technetwork/java/download-141179.html
AntDB的JDBC相关资料
- 手册:
https://jdbc.postgresql.org/documentation/、http://www.antdb.net/72_product
- 下载:
http://www.antdb.net/download
- AntDB的口令认证方式:
https://www.postgresql.org/docs/current/auth-password.html
关于AntDB数据库
AntDB数据库始于2008年,是亚信科技自主研发的分布式关系型数据库品牌,AntDB-M是面向高性能内存型数据库,是AntDB的子产品之一,在运营商的核心系统上,为全国24个省份的10亿多用户提供在线服务,具备高性能、弹性扩展、高可靠等产品特性,峰值每秒可处理百万笔通信核心交易,保障系统持续稳定运行近15年,并在通信、金融、交通、能源、物联网等行业成功商用落地。