ACI其他特性

ACI根据oracle的OCI而设计,总体上保持与OCI的一致和兼容,但神通数据库也基础了自已的一些特性,ACI中实现这些特性,为了进一步使用数据库的特性,提高接口的易用性。

获得lastInsertId值

神通数据库兼容了Mysql的AUTO_INCREMENT属性的自增列,可以查询insert后的自动增长列的当前值,ACI也进行了支持,通过调用 ACILastInsertId 接口,可以返回不超过31个字节长度的ID字符串。

char lastid[32];
ub2 id_len;
r = ACILastInsertId(stmtp, lastid, ub2 *id_len);

lastInsertId的获取规则,参阅联机手册中的LAST_INSERT_ID函数的说明。如果特别老的神通数据库版本不支持LAST_INSERT_ID函数,调用此方法可能会报错。

对象名大小写敏感

神通数据库默认所有对象名称(用户名、表名、列名、视图名、函数名称等)在不加双引号的情况下,在数据库中存储都是大写(此规则与Oracle类似)。

但为了兼容mysql、sqlserver等应用场景,神通数据库也支持了大小写敏感模式,数据库是否支撑大小写敏感模式,有以下两个参数控制:

LOWER_CASE_TABLE_NAMES=0

NAME_CASE_SENSITIVE=false

在ACI层面,通过修改配置文件name_case_sensitive参数 或者环境句柄:ACIEnv的属性ACI_ATTR_CASE_SENSITIVE,让ACI层面决定是否将用户名、表名等转换大小写。

大小写敏感涉及ACI以下模块:

  • 单用户、多用户、连接池等模式下的用户名

Text类型支持16M

描述text类型支持150000长度,对于 ACIDefineByPos 操作,返回获取数据的真实长度是ub2类型,最大值为65535,无法满足150000的需求,因此对于text类型超过65535的存储需求的场景,需要采用 ACIDefineByPos2 接口,真实长度返回变量的类型为ub4,最大4GB。因此对于OTLV4这列的第三方接口,需要修改绑定接口才可以正确处理。

XML类型支持16M

神通数据库的XML其实和Text类型一样,只是类型表现不同,因此在ACI层面按照Text类型方式进行处理。

JSON类型支持16M

描述json类型支持150000长度,对于 ACIDefineByPos 操作,返回获取数据的真实长度是ub2类型,最大值为65535,无法满足150000的需求,因此对于text类型超过65535的存储需求的场景,需要采用 ACIDefineByPos2 接口,真实长度返回变量的类型为ub4,最大4GB。因此对于OTLV4这列的第三方接口,需要修改绑定接口才可以正确处理。

读写分离集群支持

ACI支持了数据库读写分离集群的分发机制,ACI语句分发器实现了主备数据库之间的读写分离,主数据库提供读和写操作,从数据库提供读操作。分发到主数据库的语句所占比例依相关配置参数或ACISvcCtx句柄属性而定,这样既避免了主数据库服务器(Master)的过载,也有效地利用了备用数据库服务器(Slave)的资源。

需要开启enable_dispatch参或者设置ACIEnv句柄的ACI_ATTR_ENABLE_DISPATCH属性。

同时还有use_asynchronous_slave参数来设置分发机制,以及负载均衡比例(host_percentage_of_statement)等参数,详细参阅《参数说明》章节。

神通MPP5集群支持

由于神通MPP5是基于神通Kstore发展而来,因此ACI原生支持MPP5,但需要注意几个事情:

1) ACI需要采用就老协议来与神通MPP5通信,可设置compatible_old_protocal参数开启或关闭是否用老协议;设置ENV属性ACI_ATTR_COMPATIBLE_OLD_PROTOCAL可也。

2) 设置MPP5的加载数据时,需要设置mpp_loadnodenum参数,默认0,则查询时后台返回几个加载节点就用几个加载节点,如果设置了mpp_loadnodenum参数,后台则返回指定数量的加载节点。

调试日志打印

为了方便现场使用ACI出现问题后问题定位分析,ACI将内部接口的调用的出入口都添加了打印信息,比如入库函数会打印函数名称,参数地址和值;出口函数会打印返回值和out参数的地址和值。ACI有两个参数来控制日志的打印,

1) trace_level是设置是否开启打印,详细参阅参数说明章节

2) trace_file_path是设置日志文件存放的路径,且只能是目录目录,不能是文件名称;

备注:trace_file_path不能指定日志文件的原因是,应用程序会多线程调用ACI,如果都放在一个日志文件中,看到的调用信息会非常的混乱,因此ACI设计是指定存储目录,ACI会根据当前线程ID,用线程ID+日期的方式来生成日志文件,不同的线程日志存储在不同的文件中。

3) 开启日志的方式如下:

  • 设置ACI的运行配置文件,将trace_level设置为1或者更高;trace_file_path设置为一个存在的目录。设置详细参与参数说明章节;