跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQLjava

达梦数据库 Java 外部函数配置小记

在达梦数据库中启用 Java 外部函数需要设置 ENABLE_EXTERNAL_CALL 参数、部署 dmagent 并保证端口与 dm.ini 中 EXTERNAL_JFUN_PORT 一致,将编译好的 jar 包放入 dmagent 的 resources/ap 目录下,再通过 CREATE FUNCTION 语法创建函数。本文记录了完整配置步骤与关键注意事项。

链路追踪发布于 2026/6/30更新于 2026/10/1569 浏览
达梦数据库 Java 外部函数配置小记

环境

名称值
CPU12th Gen Intel(R) Core(TM) i7-12700H
操作系统CentOS Linux release 7.9.2009 (Core)
内存7G
逻辑核数8
DM 版本DM Database Server 64 V8
DB Version: 0x7000d
03134284368-20250917-293539-20149
Msg Version: 44
Gsu level(5) cnt: 0

最近有个需求要在达梦数据库里跑一些 Java 逻辑,于是折腾了一下它的 Java 外部函数。整个过程不算复杂,但有几个地方不注意就会报错,顺手记下来。

大概流程

创建外部函数的基本语法是:

CREATE [OR REPLACE] FUNCTION [IF NOT EXISTS] [<模式名>.]<函数名>[(<外部函数参数列表>)] RETURN <返回值类型> EXTERNAL '<jar 包路径>' [AND] <引用的 JAVA 函数名>[(<JAVA 函数参数列表>)] USING JAVA;

参数类型映射大致是这样:

  • int → int
  • char/varchar/varchar2 → String
  • bigint → long
  • double/float/binary_float → double
  • binary/varbinary → byte[]
  • clob → String
  • blob → byte[]

调用函数通过 Java 反射进行,所以方法最好声明为 public,所属类要有无参构造。<引用的 JAVA 函数名> 里包名和类名用 . 或 / 分隔,类与方法之间用 .。比如:

EXTERNAL '/data/sda/test.jar' "com.test.package1.test.pass(java.lang.String,java.lang.String[])" USING JAVA

如果引用函数名长度超过 128 字节,就得改用单引号括起来,并且加上 AND 关键字:

EXTERNAL '/data/sda/test.jar' AND 'com.test.package1.test.pass(java.lang.String, java.lang.String, ...)' USING JAVA

一些限制要注意:三权分立下只有 DBA 能建,四权分立下得有 DB_OBJECT_ADMIN 权限;参数 ENABLE_EXTERNAL_CALL 必须设为 1。

动手配置

1. 开启参数

[root@rhel709:/root]# cat /dmdata/DAMENG2/dm.ini |grep ENABLE_EXTERNAL_CALL
ENABLE_EXTERNAL_CALL = 1 #Whether permit external call

直接改文件还是不太放心,我习惯用存储过程设置:

SQL> SP_SET_PARA_VALUE(2,'ENABLE_EXTERNAL_CALL',1);
DMSQL 过程已成功完成
已用时间:9.553(毫秒). 执行号:1002.

2. 重启数据库

[dmdba@rhel709 bin]$ ./DmServiceDM restart

3. 生成 service.key

[dmdba@rhel709 dmagent]$ ./start.sh INSTALL_SERVICE_KEY 999999
tip: if using the deployment feature, it is recommended to start dmagent with the '-d' parameter.
Agent-V7.6.1.34685-2025.03.26-DEV Key file: "/dm/dmdbms/tool/dmagent/service.key" generated.

4. 配置 dmagent

agent.ini 里把 AP 插件打开,端口和数据库参数一致:

[dmdba@rhel709 dmagent]$ cat agent.ini |grep -E 'ap_enable|ap_port'
ap_enable = true #whether enable ap plugin
ap_port = 6363 #ap listen tcp/ip port, range[1~65535]
[dmdba@rhel709 dmagent]$ pwd
/dm/dmdbms/tool/dmagent
[dmdba@rhel709 dmagent]$ cat /dmdata/DAMENG2/dm.ini |grep EXTERNAL_JFUN_PORT
EXTERNAL_JFUN_PORT = 6363 #DmAgent port for external java fun.

5. 启动 dmagent

[dmdba@rhel709 dmagent]$ ./start.sh -d agent.ini
Starting dmagent.....
dmagent(pid: 16039) started successfully.

6. 写测试代码

搞个最简单的加法与字符串拼接:

[dmdba@rhel709 DmJar]$ cat test.java
package com.test.package1;
public class test {
    public static int testAdd(int a, int b) {
        return a + b;
    }
    public static String testStr(String str) {
        return str + " hello";
    }
}

7. 编译打包

[dmdba@rhel709 DmJar]$ javac -d . test.java
[dmdba@rhel709 DmJar]$ jar cvf test.jar com/test/package1/test.class
已添加清单
正在添加:com/test/package1/test.class(输入 = 526) (输出 = 323)(压缩了 38%)

8. 拷贝 jar 到指定目录

cp /home/dmdba/DmJar/test.jar /dm/dmdbms/tool/dmagent/resources/ap/

这一步是关键,jar 包必须放在 resources/ap 下面,否则创建函数时会报:

SQL> select MY_chr('abc');
[-7094]:外部函数共享库加载失败,错误详情 [invalid jar path, jar should under resources/ap directory].
已用时间:2.153(毫秒). 执行号:0.

9. 创建外部函数

建议用相对路径,这样集群多节点时不用操心目录差异:

CREATE OR REPLACE FUNCTION MY_INT(a int, b int) RETURN int EXTERNAL 'resources/ap/test.jar' "com.test.package1.test.testAdd" USING java;
CREATE OR REPLACE FUNCTION MY_chr(s varchar) RETURN varchar EXTERNAL 'resources/ap/test.jar' "com.test.package1.test.testStr" USING java;

10. 试一下

SQL> select MY_INT(1,2);
行号 MY_INT(1,2)
---------- -----------
1 3
已用时间:0.942(毫秒). 执行号:4505.

SQL> select MY_chr('abc');
行号 MY_CHR('abc')
---------- -------------
1 abc hello
已用时间:1.080(毫秒). 执行号:4506.

功能正常。整体来看达梦的 Java 外部函数用起来还算顺畅,主要是提前配好 dmagent 和放对 jar 路径,基本就不会踩坑。

目录

  1. 环境
  2. 大概流程
  3. 动手配置
  4. 1. 开启参数
  5. 2. 重启数据库
  6. 3. 生成 service.key
  7. 4. 配置 dmagent
  8. 5. 启动 dmagent
  9. 6. 写测试代码
  10. 7. 编译打包
  11. 8. 拷贝 jar 到指定目录
  12. 9. 创建外部函数
  13. 10. 试一下

更多推荐文章

查看全部
  • 基于 Llama-Factory 部署微调大模型 API 服务实战
  • 视觉 - 语言建模综述:核心范式与评估实践
  • Stable Diffusion WebUI 模型推荐与文件夹详解
  • DeepSeek-R1 大模型基于 MS-Swift 框架部署推理微调指南
  • Ubuntu 403 软件包下载错误解决方法
  • GitHub Copilot Agent 模式实战指南与经验总结
  • 网络安全基础入门:主机信息与端口扫描解析
  • 深入理解 C++ 继承机制
  • YOLO26n-pose 在 LSP 数据集的姿势估计训练与推理流程(Python/C++)
  • AMD 显卡运行 ComfyUI-Zluda 实战指南
  • C++ 线程库与多线程编程核心机制解析
  • AI生成解压视频/萌宠视频:2026抖音流量密码
  • Intel 芯片 Mac 安装 Genymotion 安卓虚拟机指南
  • Flutter 跨平台 Web 认证插件 flutter_web_auth_2 架构与实战解析
  • AI 如何辅助生成机械零件 3D 模型
  • 解决 IDEA 或 DataGrip 连接数据库问题:设置 JVM IPv4 参数
  • Mac 环境部署 OpenClaw 与本地大模型方案
  • 2026 年 3 月全球 AI 前沿动态与技术突破
  • Google Antigravity IDE 介绍:智能体优先开发环境
  • GitHub Awesome Copilot 项目解析:社区驱动的 AI 编程助手增强工具库

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online