由於項目的需要,最近做了一個javaWeb調用R的組件,在這里,我把自己走的一些彎路給大家總結一下:
一、選取什么插件作為java和R之間的通信?
1. 在傳統的方式中,大致可以分為兩類:一類是JRI的模式,另一種是Rserve模式。JRI模式實際上是一種嵌入式的模式,二Rserve是一種遠程調用模式。
在這兩種方式中,各有優缺點:
1.1 JRI(嵌入式模式)我體會到最大的優點是它對中文的支持較好,但是使用JRI模式下很容易造成整個系統的崩潰,比如在java調用R的時候,中間出現了異常或者錯誤,這些錯誤大致都是致命的,導致java虛擬機崩潰,從而導致整個系統崩潰,這是一個可怕的噩夢。
1.2 Rserve(遠程通信模式) 在這種通信模式下,最大的優點是javaWeb項目不需要去維護R的運行,通過TCP/IP協議直接進行通訊,但是有一個很大的缺點是它對中文的支持很弱,尤其是在windows的環境中。基本是不支持中文的,在linux環境下,似乎對中文的支持稍微好些。不是完全支持中文的話,對返回有中文或者輸入有中文的系統將是不可用的。
小結:在項目的開發中,我首先使用的是JRI模式,將項目部署以后,經常出現崩潰問題,所以最終還是放棄了JRI調用模式,隨之使用了Rserve遠程調用模式,雖然不支持中文,但是項目本身的傳參是沒有中文的,返回的數據都由R處理以后,返回數據庫,只返回一個狀態量給web服務器。
二、項目架構
項目構架中將java調用R的部分獨立出來作為一個獨立的模塊,這里可以看做是一個適配器模式。這樣即使R-WEB服務器出現致命的錯誤,也不會影響WEB項目的正常運行。
這樣設計的話,R-WEB服務器為WEB項目提供數據接口,WEB項目通過http協議間接調用R。
以上是我對JAVA調用R的一些小看法,希望大家指正。