您好,登錄后才能下訂單哦!
在《Java 如何調用 SPL 腳本》中我們介紹了在 Java 中可以部署集算器 JDBC 來調用本地 SPL 腳本,那如何能在 Java 中遠程調用 SPL 腳本呢?這就是接下來要說的重點!
實現思路通過下圖一目了然:
服務器是運行在 Java 平臺上面向分析型的高性能數據庫,作為高性能計算數據倉庫,服務器可以在離線跑批、在線查詢、多維分析和內存計算等方面提供高效的計算輸出,幫助用戶解決計算中的多種問題。
下面我們先來了解一下服務器的使用及配置,更多關于服務器的介紹可參考集算器在線文檔《教程》服務器小節。
在集算器安裝目錄的 esProc\bin 路徑下,可以找到 esprocs.exe 文件,可以直接運行它來啟動或配置服務器。使用 esprocs 時,會自動在安裝路徑下加載所需的 jar 包,但是需要注意此時使用的配置文件 raqsoftConfig.xml 和 unitServer.xml 必須放置在集算器安裝目錄的 esProc\config 路徑下。運行后,打開窗口如下:
在 esprocs.exe 執行時,窗口中會顯示加載初始設定的信息,這些設定實際上是由配置文件 raqsoftConfig.xml 決定的。在右側的菜單欄中點擊 Options,可以配置服務器的相關信息,點擊后彈出服務器配置窗口如下:
在頁面中,可以配置授權文件、主路徑、尋址路徑、日期時間格式、默認字符編碼、日志等級、文件緩存區字節數等信息。
下面我們繼續來了解服務器的配置,在右側的菜單欄中點擊 Config,可以配置分機的相關信息,點擊后在 Unit 頁面中可以配置分機信息,如下:
Temp file timeout 設定臨時文件的生命周期小時數;Check interval 必須設定為正值或 0,為檢查過期的間隔秒數;Proxy timeout 為代理生命周期,即遠程游標、任務空間的生命小時數。如果 Temp file timeout 或者 Proxy timeout 設定為 0,則不檢查過期。
分機列表 Host list 中,可以配置本機上所有可能用來運行服務器的分機,配置它們的 IP 地址,在進程列表 Process list 中,可以為一個 IP 地址配置多個進程的端口 Port,其中第一個為主進程。服務器啟動時,會自動在分機列表中,尋找有空閑進程的分機,然后再由分機將任務交由某個進程執行。需要注意的是,IP 地址需要是本機的真實 IP,在使用多網卡的情況下可以設定多個 IP。
分機配置中,Max task number 是該分機允許執行的最大作業數,而 Preferred task number 是該分機的適合作業數,當分機中使用了多個進程時,適合作業數就是分進程的總數。在 Partitions 一欄中,可以選擇每個分機上所使用的分區。
服務器的 Enable clients 頁面中可以設定客戶端白名單,如下:
選定 Check clients 后,可以在 Clients hosts 列表中,設定允許調用服務器的 IP 地址白名單,不在設定范圍中的 IP 地址將無法調用服務器執行計算。
服務器設定完成后,點擊 OK,此時可以自動設定對應的配置文件 unitServer.xml 如下:
<?xml?version="1.0"?encoding="UTF-8"?> <SERVER?Version="3"> <TempTimeOut>12</TempTimeOut> <Interval>1800</Interval> <ProxyTimeOut>12</ProxyTimeOut> <Hosts> <Host?ip="192.168.107.1"?maxTaskNum="8"?preferredTaskNum="3"> <Partitions> <Partition?name="0"?path="d:/file/parallel/node1/0"> </Partition> <Partition?name="1"?path="d:/file/parallel/node1/1"> </Partition> </Partitions> <Units> <Unit?port="8281"> </Unit> <Unit?port="8282"> </Unit> </Units> </Host> </Hosts> <EnabledClients?check="true"> <Host?start="192.168.107.1"?end="192.168.107.1"> </Host> </EnabledClients> </SERVER><?xml?version="1.0"?encoding="UTF-8"?><SERVER?Version="3"><TempTimeOut>12</TempTimeOut><Interval>1800</Interval><ProxyTimeOut>12</ProxyTimeOut><Hosts><Host?ip="192.168.107.1"?maxTaskNum="8"?preferredTaskNum="3"><Partitions><Partition?name="0"?path="d:/file/parallel/node1/0"></Partition><Partition?name="1"?path="d:/file/parallel/node1/1"></Partition></Partitions><Units><Unit?port="8281"></Unit><Unit?port="8282"></Unit></Units></Host></Hosts><EnabledClients?check="true"><Host?start="192.168.107.1"?end="192.168.107.1"></Host></EnabledClients></SERVER>
服務器配置完成后,在分機運行窗口中,點擊 Start 即可開始運行服務器,需要停止服務可以點擊 Stop,服務器停止后可以點擊 Quit 退出。如果點擊 Reset,服務將初始化重新啟動,清除所有的全局變量以及內存區。
在分機啟動時,設置的各個進程會同時啟動,可以點擊 Main 查看分機主進程的執行情況,或者點擊對應的端口號查看分機的其它分進程執行頁面。
在 Linux 系統中,可以運行 ServerConsole.sh 來啟動服務器類:
打開的分機運行窗口和在 Windows 下是相同的:
此外,還可以在執行命令時添加 -p 參數,非圖形啟動服務器,此時服務器將直接執行:
將啟動 JAVA 應用程序時加載集算器所需的 jar 包及配置文件放到項目中。需要注意的是,集算器 JDBC 所要求的 JDK 版本不得低于 1.6。
集算器 JDBC 類似一個不帶物理表的數據庫 JDBC 驅動,可以把它簡單的看成是一個只有存儲過程的數據庫。另外,集算器 JDBC 是個完全嵌入式計算引擎,已經在 JDBC 中完成了所有運算,不象數據庫那樣 JDBC 只是個接口,實際運算在獨立的數據庫服務器完成。
如果在 web 應用項目下,可以把這些 jar 包放在 WEB-INF/lib 目錄下。集算器 JDBC 需要三個基礎 jar 包,都可以在 [安裝目錄]\esProc\lib 目錄下找到:
dm.jar?//集算器計算引擎及JDBC驅動包 icu4j_3_4_5.jar?//處理國際化 jdom.jar??//解析配置文件dm.jar?//集算器計算引擎及JDBC驅動包icu4j_3_4_5.jar?//處理國際化jdom.jar??//解析配置文件
除了以上的必需 jar,還有一些為完成特定功能的 jar 包:
比如數據庫作為數據源,那么還需要相應數據庫的驅動 jar 包;
要讀寫 Office 文件,則需要加入 poi*.jar 和 xmlbeans.jar; 要使用繪制圖形功能,則需要加入 SVG 圖形處理相關的 jar 包,包括 batik*.jar、js.jar、pdf-transcoder.jar、xalan-2.6.0.jar、xercesImpl.jar、xml-apis.jar、xml-apis-ext.jar。
集算器還有個重要的配置文件 raqsoftConfig.xml,可以在 [安裝目錄]\esProc\config 下找到,需復制后放置在應用項目的類路徑下,配置文件的名稱不可改變。
在 raqsoftConfig.xml 文件中,配置了授權信息、集算器主路徑、dfx 文件尋址路徑、JDBC 遠程訪問的服務器地址等各類信息。我們先看下最基本的配置,即集算器授權文件和服務器地址的配置:
<?xml?version="1.0"?encoding="?UTF-8"?>?? <Config?Version="2">?? ?<Runtime>?? ?<Esproc>?? ????<!--集算器授權文件配置,可以是絕對路徑,也可以是相對路徑,使用相對路徑時是相對于類路徑-->?? ????<license>esproc.xml</license>?? ????<!--試用授權文件可從潤乾公司官網中下載-->?? ?</Esproc>?? ?</Runtime>?? <JDBC>?? <!--配置JDBC需遠程訪問的服務器地址-->?? <Units>?? <!--為方便多機熱備,可配置多臺服務器地址,添加多個<Unit></Unit>節點-->?? <Unit>192.168.107.1:8281</Unit>?? </Units>???????????????? ?</JDBC>?? </Config><?xml?version="1.0"?encoding="?UTF-8"?>??<Config?Version="2">???<Runtime>???<Esproc>??????<!--集算器授權文件配置,可以是絕對路徑,也可以是相對路徑,使用相對路徑時是相對于類路徑-->??????<license>esproc.xml</license>??????<!--試用授權文件可從潤乾公司官網中下載-->???</Esproc>???</Runtime>??<JDBC>??<!--配置JDBC需遠程訪問的服務器地址-->??<Units>??<!--為方便多機熱備,可配置多臺服務器地址,添加多個<Unit/>節點-->??<Unit>192.168.107.1:8281</Unit>??</Units>???????????????? ?</JDBC>??</Config>
接下來我們以訪問服務器上的數據文件為例,介紹如何在 Java 中遠程訪問服務器。
Java 通過 SPL 不僅可以訪問本地文件,還能遠程訪問服務器上的數據文件,其中包括 Txt、Excel、Json、Csv、Ctx 等多種類型的文件。
訪問時可以通過絕對路徑查文件位置,也可以通過相對路徑查找。這里的絕對路徑和相對路徑都是會到服務器上去找。使用相對路徑時,則是相對于服務器中 raqsoftConfig.xml 配置文件中的主目錄,所以,首先我們來配置下服務器上的主目錄:
在 raqsoftConfig.xml 文件的節點中添加以下節點:
<!--集算器主路徑,該路徑為單一的絕對路徑--> ?<mainPath>D:\\mainFile</mainPath><!--集算器主路徑,該路徑為單一的絕對路徑--> ?<mainPath>D:\\mainFile</mainPath>
我們把要調用的文件 employee.txt 放到服務器的主目錄下面,Java 代碼如下:
public??void?runSPL()?throws?ClassNotFoundException,?SQLException{?? ????Connection?con?=?null;?? ????PreparedStatement?st;?? ????ResultSet?set?;?? ????//建立連接?? ????Class.forName("com.esproc.jdbc.InternalDriver");?? //onlyServer用于控制當前jdbc是否對服務器進行遠程計算,為true表示遠程計算;false時表示本地計算?? //注意:屬性值為false,當SPL語句使用call?dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠程計算?? ????con=?DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");?? ????//直接執行SPL語句,返回結果集?? ????st?=?(PreparedStatement)con.createStatement();?? ????ResultSet?rs?=?st.executeQuery("$select?*?from?employee.txt");?? ????? ????//簡單處理結果集,將結果集中的字段名與數據輸出??? ????ResultSetMetaData?rsmd?=?rs.getMetaData();?? ????int?colCount?=?rsmd.getColumnCount();?? ????for?(?int??c?=?1;?c?<=?colCount;c++)?{?? ????String?title?=?rsmd.getColumnName(c);?? ????if(?c?>?1?)?{?? ????????System.out.print("\t");?? ????}?? ????else?{?? ????????System.out.print("\n");?? ????}?? ????????System.out.print(title);?? ??}?? ????while?(rs.next())?{?? ?????for(int?c?=?1;?c<=?colCount;?c++)?{?? ???????if?(?c?>?1?)?{?? ????????????System.out.print("\t");?? ??}?? ???????else?{?? ????????????System.out.print("\n");?? ??}?? ?????Object?o?=?rs.getObject(c);?? ?????System.out.print(o.toString());?? ??}?? ??}?? ???//關閉連接?? ???if?(con!=null)?{?? ????????con.close();?? ???}?? }public??void?runSPL()?throws?ClassNotFoundException,?SQLException{?? ????Connection?con?=?null;?? ????PreparedStatement?st;?? ????ResultSet?set?;?? ????//建立連接??????Class.forName("com.esproc.jdbc.InternalDriver");?? //onlyServer用于控制當前jdbc是否對服務器進行遠程計算,為true表示遠程計算;false時表示本地計算??//注意:屬性值為false,當SPL語句使用call?dfx或dfx時,會先使用本地計算,如未計算成功則會進行遠程計算??????con=?DriverManager.getConnection("jdbc:esproc:local://?onlyServer=true");?? ????//直接執行SPL語句,返回結果集??????st?=?(PreparedStatement)con.createStatement();?? ????ResultSet?rs?=?st.executeQuery("$select?*?from?employee.txt");?? ????? ????//簡單處理結果集,將結果集中的字段名與數據輸出???????ResultSetMetaData?rsmd?=?rs.getMetaData();?? ????int?colCount?=?rsmd.getColumnCount();?? ????for?(?int??c?=?1;?c?<=?colCount;c++)?{?? ????String?title?=?rsmd.getColumnName(c);?? ????if(?c?>?1?)?{?? ????????System.out.print("\t");?? ????}?? ????else?{?? ????????System.out.print("\n");?? ????}?? ????????System.out.print(title);?? ??}?? ????while?(rs.next())?{?? ?????for(int?c?=?1;?c<=?colCount;?c++)?{?? ???????if?(?c?>?1?)?{?? ????????????System.out.print("\t");?? ??}?? ???????else?{?? ????????????System.out.print("\n");?? ??}?? ?????Object?o?=?rs.getObject(c);?? ?????System.out.print(o.toString());?? ??}?? ??}?? ???//關閉連接?????if?(con!=null)?{?? ????????con.close();?? ???}?? }
執行結果:
通過上面的使用,相信您已經了解遠程訪問服務器的部署核心了吧,沒錯!Java 程序中調用服務器上的運算與調用本地的 SPL 運算操作步驟其實大體相同,總結下主要有如下三點區別:
1,部署服務器
2,JDBC 的 raqsoftConfig.xml 中添加服務器地址
3,在 JDBC 的 url 中添加 onlyServer 屬性,屬性值為 true,始終訪問服務器進行遠程計算;屬性值為 false,進行本地計算,但當 SPL 語句為 call dfx 或 dfx 時,會先在本地計算,如未計算成功則會進行遠程計算
到此,對于遠程調用 SPL 腳本的介紹就完了,Java 中調用時更多 SPL 的用法可參見《Java 如何調用 SPL 腳本》這里就不再贅述了,當然,想要更深入的學習 SPL 的小伙伴兒還可以去官網上的在線教程中查看。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。