今天改完了bug就開始考慮起怎么優化數據導入的程序了。我們的系統構架要求客戶端不能執行sql語句,所有的數據庫操作都要通過ejb來實現。我這個數據導入就麻煩了,因為是大量數據的導入,如果采用ejb的方式一條一條的導入,速度會很慢。
所以我采取了定義一個SessionBean,在SessionBean中定義一個executeSQL方法,接受兩個參數,一個是sql語句(可能帶參數),和一個參數值數組。這樣客戶端就可以直接通過sql語句操縱數據庫了。但是問題也就來了,如果每條數據都調用executeSQL訪問一次數據庫,這樣不僅會造成頻繁的事務啟動,速度很慢,而且由于各個數據庫插入操作之間是在不同的ejb調用中進行的,所以無法保證事務。我優化的重點當然也就在這兩點上。項目緊急,我不能對構架做太大的改動了,因為畢竟以前的實現方式可以導入數據了,我就琢磨著在不做大規模改動的情況下進行優化,將風險降低到最小。
系統中所有ejb都是基于接口的,比如上邊定義的executeSQL方法就定義在IImportDataFacade接口中,ejb實現這個接口,客戶端通過工廠方法ImportDataFactory.getInstance()訪問這個接口(ImportDataFactory.getInstance()返回IImportDataFacade類型)。好,我就從他下手。定義一個ImportDataDecorate類,讓他也實現IImportDataFacade接口,它的executeSQL實現不是吧sql提交到數據庫,而是把它緩存起來,等所有插入語句執行完畢后將緩存的sql語句一次性提交到我定義的一個新的接口方法中(此方法含有一個sql數組的發那個法),這樣就可以保證事務和速度了。
我是怎么實現對系統改動最小呢?對了,我只要把所有調用ImportDataFactory.getInstance().executeSQL()的地方替換成new ImportDataDecorate(ImportDataFactory.getInstance()).executeSQL(),哈哈,改動很小吧,而且一旦發現這種實現方式不可行,那么只要將ImportDataDecorate.executeSQL()的實現改成直接提交到數據庫就好了,其他調用根本不用變。設計模式很偉大呀,只不過我都不知道我用的這是什么模式,Proxy 還是Decorator?不知道,反正解決問題了,呵呵。