ArcSDE是ESRI公司的空间数据库引擎,现在工支持5中数据库,分别是Oracle,SQLServer,DB2,Informix,PostgreSQL,ArcSDE在技术层次上一共包括两部分的内容,分别是:
这部分的内容在操作系统上表现出来就是ArcSDE的动态库,ArcSDE每个版本的针对不同的操作系统动态库的数量都是不相同的,在windows操作系统上每个版本的数量都在25个左右,在linux操作系统上大约有10个左右。下图分别是在windows上ArcSDE10 for Oracle10G和linux上的ArcSDE9for Oracle10G的动态库。
Windows:
Linux:
-rwxr-xr-x 1 sde oinstall 391103 2009-02-27 libedgemt.so
-rwxr-xr-x 1 sde oinstall 1123698 11-02 07:37 libgsrvrora10g93.so
lrwxrwxrwx 1 sde oinstall 18 10-13 16:58 libicudata.so -> libicudata.so.22.0
lrwxrwxrwx 1 sde oinstall 18 10-13 16:58 libicui18n.so -> libicui18n.so.22.0
lrwxrwxrwx 1 sde oinstall 16 10-13 16:58 libicuuc.so -> libicuuc.so.22.0
-rwxr-xr-x 1 sde oinstall 230908 2009-02-27 libloceng.so
-rwxr-xr-x 1 sde oinstall 110230 2008-12-19 liblocssa.so
-rwxr-xr-x 1 sde oinstall 723578 2009-02-27 libmtchloc.so
-rwxr-xr-x 1 sde oinstall 335447 2009-02-27 libmtchmt.so
-rwxr-xr-x 1 sde oinstall 2254988 2010-05-11 libpe.so
-rwxr-xr-x 1 sde oinstall 17655840 11-02 07:37 libsdeora10gsrvr93.so
-rwxr-xr-x 1 sde oinstall 300307 2009-02-27 libsdesetup.so
-rwxr-xr-x 1 sde oinstall 4529552 11-02 07:34 libsde.so
-rwxr-xr-x 1 sde oinstall 389909 2010-05-11 libsg.so
-rwxr-xr-x 1 sde oinstall 135913 11-02 07:38 libst_shapelib.so
-rwxr-xr-x 1 sde oinstall 330238 2008-12-19 libtiff.so
lrwxrwxrwx 1 sde oinstall 17 10-13 16:58 libxerces-c.so -> libxerces-c.so.27
以上的动态库在安装完ArcSDE的程序部分和ArcGIS client后就存在了,另外最重要的是这些ArcSDE的动态库调用了数据库的动态库,如在linux操作系统下
192.168.100.228 [sde lib]$ ldd libgsrvrora10g93.so
libclntsh.so.10.1 => /opt/oracle/lib/libclntsh.so.10.1 (0x00002b5f944bc000)
libsdeora10gsrvr93.so (0x00002b5f959ab000)
libsde.so (0x00002b5f96b4b000)
libsg.so (0x00002b5f97025000)
libpe.so (0x00002b5f9717b000)
libicuuc.so.22 (0x00002b5f97488000)
libxerces-c.so.27 (0x00002b5f97643000)
libstdc++.so.6 => /usr/lib64/libstdc++.so.6 (0x00002b5f97b68000)
libm.so.6 => /lib64/libm.so.6 (0x00002b5f97e68000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00002b5f980ec000)
libc.so.6 => /lib64/libc.so.6 (0x00002b5f982fa000)
libnnz10.so => /opt/oracle/lib/libnnz10.so (0x00002b5f98651000)
libdl.so.2 => /lib64/libdl.so.2 (0x00002b5f98af2000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00002b5f98cf6000)
libnsl.so.1 => /lib64/libnsl.so.1 (0x00002b5f98f11000)
libicudata.so.22 (0x00002b5f9912a000)
/lib64/ld-linux-x86-64.so.2 (0x00000035b1000000)
ArcSDE for Oracle的动态库libgsrvrora10g93.so调用了Oracle的libclntsh.so.10.1和处理xml的ORAXML10的动态库,在windows下:
一共有两个地方包含这些动态库:
1. $SDEHOME/lib(安装SDE程序部分后)
2.%ArcGIS/%ArcGISClient%/bin中(其中%ArcGISClient%为ArcGIS的前端访问软件)。
如:安装Desktop和ArcGIS Server后,分别在Desktop的bin目录中和Server的目录中存在这些动态库。
供客户端软件或者ArcSDE的服务进程调用使用。
在这种模式下,一共包括两层网络通讯协议,第一层是ArcGIS Client与ArcSDE的服务进行进行通讯,使用的通讯协议是ESRI自己定义的应用程序协议,第二层是ArcSDE的服务进程与数据库通讯,这个通讯协议是使用数据库所公开的协议。ArcSDE的动态库是被ArcSDE的服务进程加载使用的,加载的动态库是1.2.1节的第一部分。
ArcGIS Client直接和数据库进行连接,只存在一层网络结构,使用的网络协议是数据库所公开的协议。其结构图如下:
此时ArcSDE的动态库是由客户端软件所加载的。
这部分的内容表现在数据库层次上就是数据库中对象,主要的对象包括:
主要用来存储数据。
用来操作数据的程序。
序列对象
用来维护OBJECTID对象。
这部分的内容是在SDE的post过程创建的。
ArcSDE的程序和数据库中的Schema是紧密的结合在一起的,结合的流程主要分为以下两个部分。
1. 程序部分直接提交SQL语句来操作数据
2. 程序部分调用数据库的存储过程来操作数据。
下图为他们之间的关系:
现在的难点主要在ArcSDE的程序部分,ArcSDE数据库部分都有源码,可以看到。
1. 无法实现应用服务连接方式,只可能实现直连方式。因为应用程序连接的第一层网络通讯协议是ESRI自己定义的,属于核心技术,没有公开,只有在有源码的情况下才能解决。
实现直连方式的难点包括以下两点。
1. ArcSDE的动态库无法加载其他数据库的动态库。
2.ArcSDE的程序在直接操作数据的时候会用到数据库特有的存储过程,现在数据库厂商还都没有实现这些存储过程。
要让ArcSDE支持其他数据库厂商必须解决以上两个问题,
解决方法:
1. 数据库厂商必须让ArcSDE的动态库能够加载它们的动态库。
如:
达梦的数据库结构比较接近于Oracle,由于ArcSDE的动态库调用的是Oracle的OCI的动态库,达梦的动态库必须实现Oracle的几乎所有的OCI接口,OCI的接口大约有700多个函数,这个工作量是非常巨大的。
人大金仓的数据库是基于PostGreSQL做的,因此人大金仓必须实现ArcSDE所调用的PostGreSQL的动态库。
这部分的工作量视数据库与现有ArcSDE所支持的数据库的相似程度而定,如果数据库本身是厂商自己构架的,没有参考任何开源数据库的源码,那工作量是巨大的,如果数据库本身是厂商在开源数据库源码的基础上修改的,如参考PostGreSQL实现的,可能容易一些。
2. 对于数据库自己的存储过程,数据库厂商也必须实现,但是这部分的内容通过努力是可实现的。
在没有源码的情况下,让ArcSDE来支持其它的数据库可能性并不大。所以想让ArcSDE支持其它的数据库,最好有美国ESRI在ArcSDE源码的基础上进行支持。