在《Java 如何調用 SPL 腳本》中咱們介紹了在 Java 中能夠部署集算器 JDBC 來調用本地 SPL 腳本,那如何能在 Java 中遠程調用 SPL 腳本呢?這就是接下來要說的重點!html
實現思路經過下圖一目瞭然:java
服務器是運行在 Java 平臺上面向分析型的高性能數據庫,做爲高性能計算數據倉庫,服務器能夠在離線跑批、在線查詢、多維分析和內存計算等方面提供高效的計算輸出,幫助用戶解決計算中的多種問題。node
下面咱們先來了解一下服務器的使用及配置,更多關於服務器的介紹可參考集算器在線文檔《教程》服務器小節。c++
在集算器安裝目錄的 esProc\bin 路徑下,能夠找到 esprocs.exe 文件,能夠直接運行它來啓動或配置服務器。使用 esprocs 時,會自動在安裝路徑下加載所需的 jar 包,可是須要注意此時使用的配置文件 raqsoftConfig.xml 和 unitServer.xml 必須放置在集算器安裝目錄的 esProc\config 路徑下。運行後,打開窗口以下:web
在 esprocs.exe 執行時,窗口中會顯示加載初始設定的信息,這些設定其實是由配置文件 raqsoftConfig.xml 決定的。在右側的菜單欄中點擊 Options,能夠配置服務器的相關信息,點擊後彈出服務器配置窗口以下:數據庫
在頁面中,能夠配置受權文件、主路徑、尋址路徑、日期時間格式、默認字符編碼、日誌等級、文件緩存區字節數等信息。api
下面咱們繼續來了解服務器的配置,在右側的菜單欄中點擊 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。dom
分機配置中,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 的小夥伴兒還能夠去官網上的在線教程中查看。