返回首页

gbase数据、南大通用产品文档:GBase8s客户机/服务器体系结构

更新日期:2024年09月11日

GBase 8s 产品符合客户机/服务器软件设计模型。应用程序或客户机可以位于托管数据库服
务器的计算机上,也可以位于其他计算机上。客户机应用程序将发出请求以获得数据库服
务器的服务和数据。数据库服务器通过提供客户机请求的服务和数据来作出响应。
将网络协议连同网络编程接口一起使用可连接客户机和数据库服务器并在它们之间传输数
据。
网络协议
网络协议是一组规则,规定了如何在应用程序间传输数据以及在此上下文中如何在客户机
与数据库服务器之间传输数据。
协议的规则在网络驱动程序中实施。
在数据从客户机发送到数据库服务器以及从数据库服
务器发送到客户机时,网络驱动程序包含的代码会将数据格式化。
客户机和数据库服务器通过网络编程接口获得对网络驱动程序的访问权。网络编程接口包
含的系统调用或库例程提供了对网络通信设施的访问权。 UNIX™ 的网络编程接口的示例
是 TLI(传输层接口)。
网络协议的作用在于它能够启用客户机/服务器通信,尽管客户机和数据库服务器位于具有
不同体系结构和操作系统的不同计算机上。
您可以配置数据库服务器来支持多个协议,但是仅当某些客户机使用 TCP/IP 时才考虑该
选项。
网络编程接口
网络编程接口是一种应用程序编程接口 (API),
它包含一组通信例程或系统调用。
应用程序
可以调用这些例程以便与位于相同或不同计算机上的其他应用程序通信。在该说明的上下
文中,客户机和数据库服务器是调用 TLI 或套接字 API 中的例程的应用程序。客户机和
数据库服务器都使用网络编程接口根据通信协议发送和接收数据。
如果要使客户机/服务器通信成功,那么客户机和数据库服务器的环境都必须用相同的协议
配置。然而,一些网络协议可以通过多个网络编程接口来访问。例如,根据操作系统平台
上可用的编程接口,可通过 TLI 或套接字来访问 TCP/IP。

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 29 -
数据库服务器连接
客户机应用程序使用 CONNECT 或 DATABASE SQL 语句建立与数据库服务器的连接。
例如,应用程序可能包含以下 CONNECT 语句以连接到名为 my_server 的数据库服务器:

CONNECT TO '@my_server'
提示: 数据库服务器的内部通信设施称为关联服务设施 (ASF)。如果看到一条包含对 ASF 的
引用的错误消息,那么说明连接有问题。
支持多路复用连接
有些应用程序会代表一个用户多次连接到同一台数据库服务器。多路复用连接在数据库服
务器和客户机之间使用单个网络连接以便处理来自客户机的多个数据库连接。客户机应用
程序可以建立多个到数据库服务器的连接以代表单个用户访问多个数据库。如果连接不是
多路复用的,那么每个数据库连接将建立到数据库服务器的单独网络连接。每个额外的网
络连接都将使用额外的计算机内存和处理器时间,甚至对于不活动的连接亦如此。多路复
用连接使数据库服务器可以创建多个数据库连接,而不会耗尽额外网络连接所需的额外计
算机资源。
要配置数据库服务器以支持多路复用连接,请执行以下操作:
1. 使用 DBSERVERALIASES 配置参数定义别名。
例如,指定:
DBSERVERALIASES ifx_mux
2. 为别名添加 sqlhosts 文件条目,其中将 onsqlmux 用作 nettype 条目。
hostname 和 servicename 必须具有条目,但这些条目会被忽略。可将连字符 (-)
用作条目。
例如:
#dbservername nettype hostname servicename options
ifx_mux onsqlmux - -
3. 通过在客户机用于数据库服务器连接的 sqlhosts 条目中指定m=1,
从而启用选定连
接类型的多路复用。
例如:
#dbservername nettype hostname servicename options
menlo ontlitcp valley jfkl m=1
以下示例显示了 onconfig 文件和 sqlhosts 文件条目。
onconfig 文件:
DBSERVERNAME web_tli
DBSERVERALIASES web_mux
sqlhosts 文件:

GBase 8s 管理员指南
南大通用数据技术股份有限公司
- 30 -
#dbservername nettype hostname servicename options
web_tli ontlitcp node5 svc5 m=1
web_mux onsqlmux - -
无需更改数据库服务器使用的 sqlhosts 信息。客户机程序无需执行任何特殊的 SQL 调用,
即可启用连接多路复用。
当 onconfig 文件和 sqlhosts 条目进行了适当配置并且数据库服务器
启动时,将自动启用连接多路复用。
多路复用连接不支持:

多线程客户机连接

共享内存连接

与下级数据库服务器的连接(例如,用于分布式查询或数据复制)
如果在应用程序尝试建立连接时出现以上任一情况,数据库服务器就将建立标准连接。数
据库服务器不返回 SQL 错误。
多路复用连接期间,不支持 GBase 8s ESQL/C sqlbreak() 函数。

ts_rewrite 函数族可以从tsquery 中搜索一个特定的目标子查询,并在该子查询每次出现
的地方都替换为另一个子查询。实际上这只是通过字串替换而得到的一个特定tsquery 版
本。
目标子查询和替换查询组合起来可以被认为是一个重写规则。
一组类似的重写规则可以
为搜索提供强大的帮助。
例如,
可以使用同义词扩大搜索范围
(例如,
new york, big apple, nyc,
gotham)或限制搜索范围在用户直接感兴趣的热点话题上。

ts_rewrite (query tsquery, target tsquery, substitute tsquery) returns
tsquery
ts_rewrite 的这种形式只适用于一个单一的重写规则:任何出现目标子查询的地方都被
无条件替换。例如:
gbase=#SELECT ts_rewrite('a & b'::tsquery, 'a'::tsquery, 'c'::tsquery);
ts_rewrite
------------
'b' & 'c'

ts_rewrite (query tsquery, select text) returns tsquery
ts_rewrite 的这种形式接受一个起始查询和SQL 查询命令。这里的查询命令是文本字
串形式,必须产生两个tsquery 列。查询结果的每一行,第一个字段的值(目标子查询)都
会被第二个字段(替代子查询)替换。

当多个规则需要重写时,重写顺序非常重要;因此在实践中需要使用ORDER BY
将源查询按照某些字段进行排序。
例如:举一个现实生活中天文学上的例子。我们将使用表驱动的重写规则扩大

GBase 8c SQL 参考手册
南大通用数据技术股份有限公司
645
supernovae 的查询范围:
gbase=#CREATE TABLE tsearch.aliases (id int, t tsquery, s tsquery);
gbase=#INSERT INTO tsearch.aliases VALUES(1, to_tsquery('supernovae'),
to_tsquery('supernovae|sn'));
gbase=#SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM
tsearch.aliases'); ts_rewrite
---------------------------------
'crab' & ( 'supernova' | 'sn' )
可以通过更新表修改重写规则:
gbase=#UPDATE tsearch.aliases
SET s = to_tsquery('supernovae|sn & !nebulae') WHERE t =
to_tsquery('supernovae');
gbase=#SELECT ts_rewrite(to_tsquery('supernovae & crab'), 'SELECT t, s FROM
tsearch.aliases'); ts_rewrite
---------------------------------------------
'crab' & ( 'supernova' | 'sn' & !'nebula' )
需要重写的规则越多,重写操作就越慢。
因为它要检查每一个可能匹配的规则。为了过
滤明显的非候选规则,可以使用tsquery 类型的操作符来实现。在下面的例子中,我们只选
择那些可能与原始查询匹配的规则:
gbase=#SELECT ts_rewrite('a & b'::tsquery, 'SELECT t,s FROM tsearch.aliases WHERE
''a & b''::tsquery @> t');
ts_rewrite
------------
'b' & 'a' (1 row)
gbase=#DROP TABLE tsearch.aliases;

一旦您使用 UDTMetaData 方法指定了不透明类型的属性,
您可以按照以下顺序使用类中的
方法创建不透明类型及其类和 JAR 文件:
1.
实例化 UDTManager 对象。
如以下所示建立连接:
public UDTManager(Connection conn) throws SQLException
2.
使用 createUDTClass() 方法创建 .class 和 .java 文件。
3.
使用 createJar() 方法创建 .jar 文件。
4.
使用 createUDT() 方法创建不透明类型。
创建 .class 和 .java 文件
createUDTClass() 方法具有以下签名:
public String createUDTClass(UDTMetaData mdata) throws SQLException
createUDTClass() 方法导致驱动程序为应用程序执行所有以下操作:
1.
使用 UDTMetaData.setClassName() 方法中指定的名称创建一个 Java™ 类
如果未指定类名称,则驱动程序使用 UDTMetaData.setSQLName() 方法中指定的名
称。
2.
将 Java 类代码放到 .java 文件中,然后编译此文件为 .class 文件。
3.
将新创建的名称返回到应用程序。
如果通过调用 UDTMetaData.keepJavaFile() 方法指定 TRUE,则驱动程序保留生成
的 .java 文件。缺省操作为删除此 .java 文件。
应用程序调用 createUDTClass() 方法仅创建定义不透明类型的新 .class 和 .java 文件,而不
从现有文件生成不透明类型。
创建 .jar 文件
createJar() 方法编译您在 classnames 列表中指定的类。
列表中的文件必须具有 .class 扩展名。

public String createJar(UDTMetaData mdata, String[] classnames)
throws SQLException;
驱动程序创建名为 sqlname.jar 的 JAR 文件(其中 sqlname 是您通过调
用 UDTMetaData.setSQLName() 指定的名称 )并将文件名返回到应用程序。