Geoserver用Oracle釋出WMS服務
Geoserver用Oracle釋出WMS服務
拓展gt-jdbc-oracle
仿造gt-jdbc-postgis拓展自己的gt-jdbc-oracle的服務,能夠達到釋出WMS服務能力。
訪問效率
拓展後,發現geoserver釋出oracle的WMS服務訪問效率很低,10000條空間資料需要70s。通過除錯發現是ResultSet.next()方法的效率存在問題。通過蒐集資料,發現sql語句對next()方法效率有關係。將拼接的sql語句的空間相交查詢去掉。效率有所提升。10000條花了18s左右。
證明next()是在訪問資料庫的。
別人的分析:
我覺得這個可以慢慢來分析,對資料庫的遊標來操作可能有這麼些情況:
1、一次從資料庫讀取到記憶體中,然後斷開連線。每次讀取都從記憶體中讀取。如果我是驅動設計者肯定不會這麼設計,很顯然這樣的讀取不能夠支援大資料量,如果資料有幾百萬條,一次性讀取到記憶體中,不要說每次讀取的數度會很慢,而且記憶體也放不下。當然這種做法在取資料的時候會比較快,但是太不實用了。顯然不能這麼設計。
2、每次next的時候都去資料庫取資料,去玩後斷開連線,等到下一次next再開啟連結取。這種做法明顯也不行,每次next操作都要開啟關閉資料庫,如果有大量的讀取資料庫操作,那樣完了,cpu處理不過來。
3、讀取資料時跟資料庫建立一個固定連結,每次next讀取資料,但是不關閉資料庫連線,等到資料全部去玩再關閉連線,這種方式顯然比上面兩種要好。但是仍然存在瓶頸,每次去資料庫讀取,就要在資料庫中多做操作同樣影響速度。
4、大致與上一個一樣,只是在第一次next的時候同時向後讀取若干資料到記憶體中,以後每次next到記憶體中取,不去資料庫中去,直到記憶體中取完再去資料庫中取若干資料,這樣又更好了,提高了操作速度也節約記憶體資源。
5、在next的時候並不讀取任何資料,只是做一個標記,然後等next完成,一次性把標記項傳給資料庫操作物件,一次性讀取出來然後關閉。
相關設定:
setFetchSize()
是設定ResultSet每次向資料庫取的行數
但是你要這樣還是可以把所有的資料都取出來,這個只是優化了,取不完資料的情況下
setMaxRows()
是設定Resultset最多返回的行數
用下面這個方法才能滿足你的要求