从ArcGIS9.3开始,ArcSDE开始支持Postgresql(支持所有的模型)。其安装步骤总结为:
1. 将ESRI所提供的st_geometry.so(dll)拷贝到Postgresql相应的某个目录下
windows:拷贝到Postgresql的lib的目录中。
linux:拷贝到PKGLIBDIR变量所指向的目录中(执行pg_config命令获取)
2. 执行SDE的post操作
这个动态库是不是只有在post过程中会使用,post完后就不使用了可以删除掉吗,答案当然是否了,为什么?
st_geometry.so(dll)存储着已经封装好的公用函数,在Postgresql的函数中被调用,在windows下可以通过depends工具查看,如下图:
linux可以通过nm命令查看其内部的函数,如下图。
以常用的ST_AsText函数为例子,在Postgresql的st_astext(st_geometry)被调用,定义如下:
CREATE OR REPLACE FUNCTION st_astext(st_geometry)
RETURNS cstring AS
*’st_geometry’,‘ST_AsText’
LANGUAGE c* IMMUTABLE STRICT
COST 1;
ALTER FUNCTION st_astext(st_geometry)
OWNER TO sde;
GRANT EXECUTE ON FUNCTION st_astext(st_geometry) TO sde;
GRANT EXECUTE ON FUNCTION st_astext(st_geometry) TO public;
调用原理:
Postgresql采用的是动态加载动态库的方法进行动态库加载,只有前端调用使用到了st_geometry动态库中的函数,postgres进程才会加载st_geometry动态库。可以通过以下测试方法验证。
- 使用psql连接到数据库上
查找Postgresql所对应的pid,
sde=# select pid,client_addr,client_port,application_name from pg_stat_activity;
pid | client_addr | client_port | application_name
——+—————–+————-+————————-
4283 | 192.168.100.138 | 26625 | pgAdmin III - ?????????
4284 | 192.168.100.138 | 26628 | pgAdmin III - ?????????
5402 | 192.168.100.231 | 45058 | psql.bin
5402进程代表postgresql的后台进程,使用lsof查看其所加载的动态库,如下图。
该进程并没有加载st_geometry.so文件。
从输出结果中可以看到建立的本地连接端口号是45058,与上面查询结果一致。
我们执行sde.st_astext()函数后,继续查看该进行
可以看到执行完st_astext函数后,5402进程已经加载上了st_geometry.so(绿色部分),同时还访问了红色部分的文件(后台表所在的文件)。