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最多返回的行数
用下面这个方法才能满足你的要求

转载自:https://blog.csdn.net/jackliuy/article/details/53539275

You may also like...

退出移动版