调用DM FLDR JNI导出数据库文件
有任何問(wèn)題請(qǐng)到技術(shù)社區(qū)反饋。
24小時(shí)免費(fèi)服務(wù)熱線(xiàn):400 991 6599
達(dá)夢(mèng)技術(shù)社區(qū):https://eco.dameng.com
1. 介紹
java通過(guò) jni 接口調(diào)用dmfldr快速裝載接口導(dǎo)數(shù)據(jù)。
開(kāi)發(fā)環(huán)境:CentOS7+DM8(Linux)
2. 準(zhǔn)備工作
2.1 java項(xiàng)目引入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項(xiàng)目中引入dll
程序在編譯的過(guò)程中需要調(diào)用DM的一些lib動(dòng)態(tài)鏈接庫(kù)文件(運(yùn)行java項(xiàng)目時(shí)需要這些dll)
我采用的方式是在啟動(dòng)類(lèi)的VM options參數(shù) 配置DLL的路徑
DM調(diào)用的dll在達(dá)夢(mèng)安裝目錄的三個(gè)目錄里面都需要引入
// 我的dm安裝目錄是 D:\damba\dm8 ,需要自行修改稱(chēng)自己的目錄 -Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-82.3 創(chuàng)建表
-- 創(chuàng)建表 CREATE TABLE "SYSDBA"."TEST" ( "C1" INT, "C2" INT, "C3" DATE) STORAGE(ON "MAIN", CLUSTERBTR) ; -- 插入數(shù)據(jù) 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. 代碼實(shí)戰(zhàn)
3.1 導(dǎo)出所有數(shù)據(jù)
需求:導(dǎo)出表的所有數(shù)據(jù)
3.1.1 linux
- 新建 import_start.ctl 文件(新建目錄: /dm8/ctl/insert_test)
- 在dm8的安裝目錄bin目錄下運(yùn)行dmfldr腳本
- 執(zhí)行成功后會(huì)生成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 '|'";//導(dǎo)出的ctrl內(nèi)容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 導(dǎo)出指定列的數(shù)據(jù)
需求:導(dǎo)出表的某一些指定列并將顯示
3.2.1 linux
- 新建 import_targe_data.ctl 文件(新建目錄: /dm8/ctl/insert_test)
- 在dm8的安裝目錄bin目錄下運(yùn)行dmfldr腳本
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" +" )";//導(dǎo)出的ctrl內(nèi)容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 導(dǎo)出指定列并修改NULL值
需求:導(dǎo)出指定表的列并將顯示NULL的字段修改為其他值
溫馨提示:因?yàn)樵贑TL文件中編寫(xiě)語(yǔ)句,存在雙引號(hào)沖突的問(wèn)題,使用函數(shù)時(shí)采用雙單引號(hào)形式
3.3.1 linux
- 新建 import_targe_func_data.ctl 文件(新建目錄: /dm8/ctl/insert_test)
- 在dm8的安裝目錄bin目錄下運(yùn)行dmfldr腳本
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" +" )";//導(dǎo)出的ctrl內(nèi)容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();}} }===================================
下面的測(cè)試是另外一張表測(cè)試附表結(jié)構(gòu)
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 導(dǎo)出數(shù)據(jù)并使用嵌套函數(shù)
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 導(dǎo)出數(shù)據(jù)并函數(shù)嵌套使用char函數(shù)
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 導(dǎo)出數(shù)據(jù)并函數(shù)嵌套+拼接
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 導(dǎo)出數(shù)據(jù)并函數(shù)嵌套+替換+拼接
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. 常見(jiàn)問(wèn)題
4.1 指定的列與服務(wù)器列不一致
編寫(xiě)的ctl文件中 SQL屬性的語(yǔ)句執(zhí)行后的值與FIELDS屬性配置的值不一樣導(dǎo)致,修改一下就好
4.2 java.lang.UnsatisfiedLinkError
報(bào)錯(cuò):Exception in thread “main” java.lang.UnsatisfiedLinkError: no dmutl in java.library.path
意思是說(shuō):運(yùn)行項(xiàng)目需要去java.library.path中加載dmutldll然后沒(méi)找到。我的解決方案是在啟動(dòng)類(lèi)上配置參數(shù)去配置這個(gè)DLL所在的文件路徑
我采用的方式是在啟動(dòng)類(lèi)的VM options參數(shù) 配置DLL的路徑
DM調(diào)用的dll在達(dá)夢(mèng)安裝目錄的三個(gè)目錄里面都需要引入
// 我的dm安裝目錄是 D:\damba\dm8 ,需要自行修改稱(chēng)自己的目錄 -Djava.library.path=D:\damba\dm8\drivers;D:\damba\dm8\drivers\logmnr;D:\damba\dm8\bin -Dfile.encoding=UTF-84.3 項(xiàng)目的資料
鏈接:https://pan.baidu.com/s/1Gtsbsq_EM25pzWYuBWpVzg 提取碼:4hrp
總結(jié)
以上是生活随笔為你收集整理的调用DM FLDR JNI导出数据库文件的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: vue 封装调用 wangeditor
- 下一篇: linux cmake编译源码,linu