暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在监听中看到关于 extproc + ORCLXDB 来科普

ByteHouse 2025-05-15
317

extproc进程

在编程过程中,我们可能会发现有些功能通过PL/SQL完成会很麻烦,而通过C/C++语言编程则会容易很多。因此,Oracle提供了在PL/SQL程序里直接调用外部函数(包括C函数或Java方法)的功能。调用外部函数的过程如下:

  • 用户进程执行PL/SQL程序。
  • 在执行的PL/SQL程序过程中,调用了一个C/C++语言写的函数:c_func。这里需要借助别名库(Alias Library)。别命苦是数据库里的一个对象,用来描述一个外部函数所在的动态链接库的路径和名称。通过别名库,从而可以知道调用的外部函数在哪个文件里。
  • PL/SQL将对外部函数的调用请求发给监听器。
  • 监听器生成一个extproc进程,该进程专门用来处理对外部函数的调用。每个session都会生成一个属于该session的extproc进程,并且在整个session生命周期里,extproc进程会一直存在。
  • Extproc进程负责将别名库所指定的动态链接库文件加载到内存。
  • Extproc进程执行指定的外部函数,并将结果返回给服务器进程,进而返回给用户进程。

需要对监听器进行配置(在listener.ora文件中配置),从而启动extproc进程。
其中“(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC0))”说明监听extproc进程请求的地址;而SID_DESC部分则说明extproc进程的连接信息。

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
  )

这是一个Oracle数据库监听器配置中常见的IPC协议地址条目,主要用于处理PL/SQL调用外部程序的功能5。具体解析如下:

  1. 协议类型
    PROTOCOL = IPC 表示使用进程间通信协议,这是Oracle用于本地进程通信的高效方式。
  2. 关键参数
    KEY = EXTPROC1521是IPC通信的标识符:
  • 默认使用EXTPROC1521(1521端口对应)或EXTPROC0
  • 该KEY值需与外部过程调用的配置保持一致

EXTPROC1521与EXTPROC0的区别主要体现在以下方面:

  1. 端口关联性
  • EXTPROC1521
    名称中的1521明确对应Oracle监听器的默认TCP端口号,用于与TCP监听配置保持命名一致性。这使得该标识符更直观地反映其与标准服务的关联性。
  • EXTPROC0
    名称中的0属于早期版本的通用命名习惯,未直接关联端口号。这种命名方式常见于非标准端口场景或特定历史版本中。
  1. 多实例场景下的应用
  • EXTPROC1521
    通常用于单一实例环境下的IPC通信标识,确保配置文件的简洁性。
  • EXTPROC0
    在需要同时运行多个监听器或多实例的场景中,可通过递增数字(如EXTPROC0、EXTPROC1)实现标识符的唯一性,避免IPC通道冲突25。
  1. 配置兼容性
  • EXTPROC1521是Oracle默认推荐的外部过程调用标识符,尤其在11g及以上版本中更普遍使用。
  • EXTPROC0多见于早期版本或特殊场景(如非默认端口配置),部分第三方工具可能会沿用此命名规则。
  1. 功能等价性
    两者在功能实现上并无差异,均通过IPC协议为PL/SQL调用外部程序(如C/Java函数)提供通信通道。每个会话均会创建独立的extproc进程处理请求57。选择何种标识符主要取决于环境配置要求和命名规范需求。

配置对比示例

# 标准单实例配置 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521)) # 多实例场景配置 (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC0)) (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))

注意:修改KEY值后需同步调整listener.ora和tnsnames.ora中的相关配置,确保服务指向一致性。

然后我们还要配置tnsnames.ora文件,注意,该文件也必须位于数据库服务器端(应该是说,tnsname.ora文件的以下内容属于数据库客户端的)。我们需要添加如下内容:

EXTPROC_CONNECTION_DATA=
  (DESCRIPTION=
    (ADDRESS_LIST=
      (ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1521))
    )
     (CONNECT_DATA=
     (SID=PLSExtProc)
   )
)

配置完毕以后,可以尝试tnsping 连接字符串名称,如果成功,则说明监听没有问题。

[oracle@book admin]$ tnsping EXTPROC_CONNECTION_DATA

接下来,我们创建一个C语言编写的函数,如下:

[oracle@book ~]$ vi calc_tax.c
calc_tax(n)
int n;
{
int tax;
tax=(n*15)/100;
return(tax);
}

该函数完成的功能非常简单,计算传入参数的15%,并作为税额返回给调用者。
将calc_tax.c文件编译成动态链接库,并将生成的库文件复制到$ORACLE_HOME/bin目录下:

[oracle@book ~]$ cc -shared -o calc_tax.so calc_tax.c
[oracle@book ~]$ cp calc_tax.so $ORACLE_HOME/bin

然后,我们创建一个别名库,用来说明将要调用的C函数所在的库文件,并将使用c_code别名库的权限赋给HR用户:

SQL> connect / as sysdba
SQL> create or replace library c_code as '$ORACLE_HOME/bin/calc_tax.so';
2 /
SQL> grant execute on c_code to hr;

要使用这个calc_tax函数,还需要在数据库里创建一个调用声明。如下所示:

SQL> connect hr/hr
SQL> create or replace function call_c
2 (x binary_integer)
3 return binary_integer
4 as language c
5 library sys.c_code
6 name "calc_tax";
7 /

在调用声明里定义了calc_tax函数的传入传出参数、所在的别名库名称(library sys.c_code 部分)以及在动态链接库中的函数名(name “calc_tax”)等。
现在,我们就可以通过调用call_c,进而调用calc_tax函数了。如下所示:

SQL> set serveroutput on
SQL> var v_salary number;
SQL> var v_tax number;
SQL> exec :v_salary := 10000;
SQL> exec :v_tax := call_c(:v_salary);
SQL> print v_tax;
V_TAX
-----------
1500

从返回结果可以看到,我们成功调用了C函数calc_tax。

ORCLXDB

ORCLXDB 是 Oracle 数据库中的一个默认服务,主要用于支持 XML DB (XDB) 功能。以下是关键点解析:

  1. XML DB 核心作用
    ORCLXDB 服务对应 Oracle 的 XML 数据库功能,提供 XML 数据存储、查询和管理能力。例如:
  • 通过 XPath 和 XQuery 处理 XML 数据;
  • 支持 XMLType 数据类型;
  • 提供 HTTP/WebDAV 协议访问接口。
  1. 监听与连接管理
    通过监听器(如 LSNRCTL)可查看 ORCLXDB 服务的状态,示例输出如下:
服务端:ORCLXDB: Service "ORCLXDB" has 1 instance(s). Instance "ZHH", status READY...

服务状态 READY 表示该服务已注册到监听器并可接收连接请求。

  1. 与共享服务器模式的关联
    在共享服务器架构中,ORCLXDB 可能通过分派器(Dispatcher)进程处理并发请求,提升资源利用率。例如:
  • 分派器(Dnnn)接收客户端请求并放入公共队列;
  • 共享服务器进程(Snnn)处理队列中的任务。
  1. 配置与常见问题
  • 若服务状态异常(如 UNKNOWN),需检查数据库实例是否正常启动或 XDB 组件是否启用;
  • 在 Data Guard 等高可用场景中,需确保主备库的 ORCLXDB 服务配置一致性。

ORCLXDB 是 Oracle XML DB 的默认服务标识,兼具 XML 数据处理与连接管理的双重角色,其运行状态直接影响 XML 功能及监听服务的可用性。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论