ArcSDE For PostgreSQL中的st_geometry.so…


从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动态库。可以通过以下测试方法验证。

  1. 使用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(绿色部分),同时还访问了红色部分的文件(后台表所在的文件)。

从上面测试结果可以看出来,删除之后无法调用Postgresql的函数了,就各种不正常了。

转载自:https://blog.csdn.net/liufeng1980423/article/details/50393536

You may also like...