调用DM FLDR JNI导出数据库文件
有任何问题请到技术社区反馈。
24小时免费服务热线:400 991 6599
达梦技术社区:https://eco.dameng.com
1. 介绍
java通过 jni 接口调用dmfldr快速装载接口导数据。
开发环境:CentOS7+DM8(Linux)
2. 准备工作
2.1 java项目引入jar
引入jar com.dameng.floader.jar、 DmJdbcDriver18.jar
我采用的方法是将jar包放到lib目录下.pom文件配置引入路径
<dependency><groupId>com.dm</groupId><artifactId>DmJdbcDriver18</artifactId><version>18</version><scope>system</scope><systemPath>${project.basedir}/lib/DmJdbcDriver18.jar</systemPath></dependency><dependency><groupId>com.dm</groupId><artifactId>Floader</artifactId><version>1.0</version><scope>system</scope><systemPath>${project.basedir}/lib/com.dameng.floader.jar</systemPath></dependency>
2.2 java项目中引入dll
程序在编译的过程中需要调用DM的一些lib动态链接库文件(运行java项目时需要这些dll)
我采用的方式是在启动类的VM options参数 配置DLL的路径
DM调用的dll在达梦安装目录的三个目录里面都需要引入
// 我的dm安装目录是 D:\damba\dm8 ,需要自行修改称自己的目录
-Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-8
2.3 创建表
-- 创建表
CREATE TABLE "SYSDBA"."TEST"
(
"C1" INT,
"C2" INT,
"C3" DATE) STORAGE(ON "MAIN", CLUSTERBTR) ;
-- 插入数据
INSERT INTO test VALUES(1, 1 , '2021-09-15');
INSERT INTO test VALUES(2, 2 , '2021-09-16');
INSERT INTO test VALUES(3, 3 , '2021-09-17');
INSERT INTO test VALUES(4, null , '2021-09-18');
3. 代码实战
3.1 导出所有数据
需求:导出表的所有数据
3.1.1 linux
- 新建 import_start.ctl 文件(新建目录: /dm8/ctl/insert_test)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
- 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_start.ctl\' mode=\'out\'
- 执行成功后会生成test.txt文件
3.1.2 java
package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author xgt(小光头)* @version 1.0* @date 2021-9-18 11:02*/
public class Import_start {public static void main(String[] args){//System.out.println(System.getProperty("java.library.path"));Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}
3.2 导出指定列的数据
需求:导出表的某一些指定列并将显示
3.2.1 linux
- 新建 import_targe_data.ctl 文件(新建目录: /dm8/ctl/insert_test)
OPTIONS
(
SQL ='select C1 from SYSDBA.TEST'
)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' '
)
- 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_targe_data.ctl\' mode=\'out\'
3.2.2 java
package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author 高垣* @version 1.0* @date 2021-9-18 11:02*/
public class Import_targe_data {public static void main(String[] args){//System.out.println(System.getProperty("java.library.path"));Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +"SQL='select C1 from SYSDBA.TEST'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'\n" +" (\n" +" C1 TERMINATED BY ' '\n" +" )";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}
3.3 导出指定列并修改NULL值
需求:导出指定表的列并将显示NULL的字段修改为其他值
温馨提示:因为在CTL文件中编写语句,存在双引号冲突的问题,使用函数时采用双单引号形式
3.3.1 linux
- 新建 import_targe_func_data.ctl 文件(新建目录: /dm8/ctl/insert_test)
OPTIONS
(
SQL ='select c1,IFNULL(c2,''1'') c2 from test'
)
LOAD DATA
INFILE '/dm8/ctl/insert_test/test.txt'
INTO TABLE test
FIELDS '|'
(
C1 TERMINATED BY ' ',
C2 TERMINATED BY ' '
)
- 在dm8的安装目录bin目录下运行dmfldr脚本
./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_test/import_targe_func_data.ctl\' mode=\'out\' ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test.ctl\' mode=\'out\' select C1,replace(V1,chr(47),''\'') V1 from test1'
3.3.2 java
package com.dm.demo.jni;
import com.dameng.floader.Instance;
import com.dameng.floader.Properties;import java.io.UnsupportedEncodingException;/*** @author 高垣* @version 1.0* @date 2021-9-18 11:02*/
public class TestFloderImport2 {public static void main(String[] args){Instance instance = new Instance();try{//初始化if (instance.allocInstance()){instance.setAttribute(Properties.FLDR_ATTR_SERVER, "192.168.60.137");instance.setAttribute(Properties.FLDR_ATTR_PORT, "5236");instance.setAttribute(Properties.FLDR_ATTR_UID, "SYSDBA");instance.setAttribute(Properties.FLDR_ATTR_PWD, "SYSDBA");instance.initializeInstance(null, null, null, "\"SYSDBA\".\"TEST\"");String attribute = instance.getAttribute(Properties.FLDR_ATTR_DATA_CHAR_SET);String ctl = "OPTIONS\r\n" +"(\r\n" +"mode='out'\r\n" +"SQL='select c1,IFNULL(c2,''1'') c2 from SYSDBA.TEST'\r\n" +")\r\n" +"Load\r\n" +"infile 'e:\\fldr_out.txt'\r\n" +"Append\r\n" +"into table \"SYSDBA\".\"TEST\"\r\n" +"FIELDS '|'\n" +" (\n" +" C1 TERMINATED BY ' ',\n" +" C2 TERMINATED BY ' '\n" +" )";//导出的ctrl内容instance.setControl(ctl);}else {try {byte[] bytes = instance.getErrorMsg().getBytes("utf-8");System.out.println(new String(bytes, "utf-8"));} catch (UnsupportedEncodingException e) {e.printStackTrace();}}}catch (Exception e){System.out.println(e);}finally{//释放instance.unitialize();instance.free();}}
}
===================================
下面的测试是另外一张表测试附表结构
CREATE TABLE "SYSDBA"."TEST1"
(
"C1" INT,
"V1" VARCHAR(50)) STORAGE(ON "MAIN", CLUSTERBTR) ;insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(1, '11/a');
insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(2, '22/2/2');
insert into "SYSDBA"."TEST1"("C1", "V1") VALUES(3, '33/3//');
3.4 导出数据并使用嵌套函数
OPTIONS
(
SQL ='select C1,replace(V1,chr(47),''\'') V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test1.ctl\' mode=\'out\'
3.5 导出数据并函数嵌套使用char函数
OPTIONS
(
SQL ='select C1,replace(replace(V1,chr(47),chr(41)),chr(41),chr(39)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test2.ctl\' mode=\'out\'
3.6 导出数据并函数嵌套+拼接
OPTIONS
(
SQL ='select C1,replace(replace(V1,chr(47),chr(41)),chr(41),chr(39)|| chr(42)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test3.ctl\' mode=\'out\'
3.7 导出数据并函数嵌套+替换+拼接
OPTIONS
(
SQL ='select C1,replace(replace(V1,''/'',chr(41)),chr(41),chr(39)|| chr(42)) V1 from test1'
)
LOAD DATA
INFILE '/dm8/ctl/insert_func/test1/test.txt'
INTO TABLE test1
FIELDS '|'
(
C1 TERMINATED BY ' ',
V1 TERMINATED BY ' '
)
[dmdba@localhost bin]$ ./dmfldr userid=SYSDBA/SYSDBA@192.168.60.137:5236 control=\'/dm8/ctl/insert_func/test1/test4.ctl\' mode=\'out\'
4. 常见问题
4.1 指定的列与服务器列不一致
编写的ctl文件中 SQL属性的语句执行后的值与FIELDS属性配置的值不一样导致,修改一下就好
4.2 java.lang.UnsatisfiedLinkError
报错:Exception in thread “main” java.lang.UnsatisfiedLinkError: no dmutl in java.library.path
意思是说:运行项目需要去java.library.path
中加载dmutl
dll然后没找到。我的解决方案是在启动类上配置参数去配置这个DLL所在的文件路径
我采用的方式是在启动类的VM options参数 配置DLL的路径
DM调用的dll在达梦安装目录的三个目录里面都需要引入
// 我的dm安装目录是 D:\damba\dm8 ,需要自行修改称自己的目录
-Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-8
4.3 项目的资料
链接:https://pan.baidu.com/s/1Gtsbsq_EM25pzWYuBWpVzg 提取码:4hrp
调用DM FLDR JNI导出数据库文件相关推荐
- Android模拟器(ADM)打不开/data,无法导出数据库文件
貌似新版的模拟器都要root才能访问database了,下面方法行不通. 方法一:使用facebook的Stetho 方法二:我选择放弃不看... 1.进入Android/sdk/platform-t ...
- php如何对几G的文本数据去重,Linux下导出数据库文件进行统计+去重
本文主要讲述了如何在Linux中实现数据库文件统计以及去重,感兴趣的朋友可以来学习一下! 1. 把数据库表导出到文本文件中 mysql -h主机 -P端口 -u用户 -p密码 -A 数据库 -e &q ...
- 服务器怎么导出数据库文件,怎么导出服务器数据库文件
怎么导出服务器数据库文件 内容精选 换一换 确认后点击确认即可,导出内容参考表1.选择界面 MongoDB官网提供了针对不同操作系统的客户端安装包,其二进制安装包下载页面链接为:https://www ...
- mysql语句导出数据库文件_通过Mysql命令行语句来导入、导出数据库文件
Mysql命令行导出数据库: 1.首先我们通过命令行进入到mysql安装目录的bin目录下,比如我输入的命令行为: cd C:\Program Files\MySQL\MySQL Server 5.5 ...
- 如何在 MySQL / MariaDB 中导入导出数据,导入导出数据库文件、Excel、CSV
文章目录 本教程将详细讲解 1. MySQL / MariaDB 数据库数据「导出」 2. MySQL / MariaDB 数据库数据「导入」 3. 使用「卡拉云」一键导入导出 MySQL / Mar ...
- mysql导入导出数据库文件(转载)
http://www.cnblogs.com/zcw-ios/articles/3319480.html 在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看 ...
- cmd命令不识别exp_cmd 命令行exp 命令导出数据库文件
好处:命令导出的数据库包含了所有比如:表结构,表数据,序列,触发器,表空间等 参考博客:https://www.cnblogs.com/tytr/p/9056690.html1 将数据库TEST完全导 ...
- mysql数据库导入sql文件Mysql导入导出.sql文件的方法
mysql数据库导入sql文件:Mysql导入导出.sql文件的方法 mysql导入sql文件:Mysql导入导出.sql文件 步骤如下: 一.MYSQL的命令行模式的设置: 桌面->我的电脑- ...
- java大数据量导出csv文件并压缩
java大数据量导出csv文件并压缩 java使用POI大数据量导出excel一般会存在以下几个问题: 一次从数据库查询出这么大数据,查询缓慢 查询数据量过大时会内存溢出 解决方案:分页查询数据,比如 ...
最新文章
- Android性能优化之运算篇
- Java 高级 --- 多线程快速入门
- LCS最大公共子序列【转载】
- Android 用adb 打印linux内核调试信息dmesg和kmsg命令
- CentOS下搭建Squid代理服务器
- 故障模块名称kernelbase.dll_西门子PLC数字量DI扩展模块1221一级总代理
- python中字典的键必须是可以哈希的对象
- 安卓手机关闭底部键盘灯的方法(htc G11亲测有效)
- javascript JSON.parse和eval的区别
- swift UI专项训练19 TextView 多行文本
- linux系统自行清理归档日志_Linux下自动删除归档日志文件的方法
- 网络空间安全要学c语言吗,网络空间安全科学与技术(英文)杂志投稿-专门发布期刊官方征稿信息-万维书刊网...
- 怎么让拿到的字符串类型的值去掉双引号显示_python入门系列:Python数据类型
- 【word】如何在word宏里面写vb代码选中所有表格
- 2021-2022-1 线性代数知识点总结
- gp数据库和mysql区别_gp数据库(创建表分区)
- 很常用的倒计时脚本,可任意设置时…
- PMP-项目成本管理
- SkeyeVSS智慧渣土可视化管理系统赋能渣土车辆智能化管理
- 递归:汉罗塔问题的程序实现
热门文章
- Java黑皮书课后题第10章:10.2(BMI类)将下面的新构造方法加入BMI类中
- Java黑皮书课后题第6章:**6.24(显示当前日期和时间)程序清单2-7显示当前时间。改进这个例子,显示当前的日期和时间。程序清单6-12中的日历例子可以提供一些如何提供如何求年月日的思路
- const_cast的应用
- [转载]常用CASE工具介绍
- luogu P2512 [HAOI2008]糖果传递
- 蓝书3.7 欧拉回路
- @Transactional注解事务不回滚不起作用无效
- SQL Server加密存储过程的破解
- IOS第二天多线程-04简化单例模式
- IOS设计模式之四(备忘录模式,命令模式)