如果我们尝试往SDE中使用AO代码加载大量的数据,比如每个图层50万条记录,一共30个图层,那么这个过程是个不折不扣的噩梦,你会遇到许多匪夷所思的问题,一般而言,出了问题总是会报个fdoerr号,我们也可以查一查,但如果出现的问题号属于SDE ERROR类型,就不好说了,你会发现某些情况整个网络上都没有看到过,就是一个孤例。比如我遇到过的FDO_E_SE_DB_IO_ERROR和FDO_E_SE_OUT_OF_LOCKS等。
我在往SDE中写代码导入数据时候频繁遇到FDO_E_SE_DB_IO_ERROR问题,尽管safe网站上给出了该问题的三种可能原因,但我一直都没能从Oracle的角度解决。统计一下往SDE导入数据成功的情况,每次导入一个要素类,即每个要素类导入时都给开启一个专用的gsrvr进程,成功率是最高的,几乎为95%。 不成功的10%是一次导入200万条标注要素类,但分开岛,每次50万条,也一切安好。
那么问题就来了,我们知道,SDE安装后,SDE与DBMS之间有一个giomgr进程负责管理双方的通讯过程,即根据访问请求建立gsrvr进程。一般地,gsrvr将处理与SDE有关的查询,存储,删除等操作,并且它能处理多个连接请求,它与DBMS的关系就是“通则不痛,通则不痛”,一旦传输的数据量多了,gsrvr就开始抽风了。我们的问题是,如何让一个要素类处理完成后,释放这个连接,即关闭该 gsrvr进程,在下一个要素类开始时再次建立一个新gsrvr进程。这个方式的确也是最为保险的。
现在问题就是,如何释放SDE连接,事实上,如果使用纯COM对象来写,这几乎不是问题,有人认为将工作空间对象设置为null即可。比如我们写个VB的代码:
dim pFWS as IFeatureWorkspace
set pFWS=SdeWorkspaceFactory.open() '1
set pFWS=nothing '2
去看看Oracle的连接,在1执行完后,应该有两个SDE链接,而在执行完2以后,就只有一个SDE链接了,其所有者是giomgr。显然,SDE连接被关闭了。
那么在.NET平台中,这种set pFWS=nothing是行不通的,我们得使用
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFWS);
才能让非托管代码在内存中被清除。试一试,也可以发现SDE的连接关闭。
将问题再复杂一点,如果我们遍历一次pFWS中的某个要素类,会发现即使使用
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFWS);
也搞不定,解决的方法是,将你在代码中new出来的所有的AO对象都用
System.Runtime.InteropServices.Marshal.ReleaseComObject
方法释放,某些循环产生的对象,如:
pFeature=pFeatureCursor.NextFeature();
while(pFeature!=null)
{
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeature);
pFeature=pFeatureCursor.NextFeature();
}
System.Runtime.InteropServices.Marshal.ReleaseComObject(pFeatureCursor);
也必须销毁,如果有一个与SDE数据库相关的对象未销毁,则仍然存在两个SDE连接。
使用这种一个图层一个gsrvr进程的方法后,再未出现过FDO_E_SE_DB_IO_ERROR问题。
分享到:
相关推荐
如何自动关闭空闲的sde连接,让其他人来连接; 如何自动关闭空闲的sde连接,让其他人来连接
6个dll的打包 Arcgis连接 postgresql sde 时遇到的问题以及解决办法 Arcgis连接 postgresql sde 时遇到的问题以及解决办法
我们大体都知道ArcSDE的连接数有 48 的限制,很多人也知道这个参数可以修改,并且每种操作系统能支持的最大连接数是不同的。如果应用报错:超出系统最大连接数 该如何处理?
数据库、ArcCatalog空间数据源正常访问,数据库设置没问题时,ArcEngine连接SDE时报"ORA-12560: TNS: 协议适配器错误"的解决办法;ArcEngine连接SDE总结;ArcSDE:C#打开SDE数据库的几种方式总结
AO编程和ArcSDE连接SQLserver数据库的最好入门教程!对与搞Gis的绝对有帮助!
教你如何利用Catalog远程连接sde数据库,希望对大家有帮助。
本文档用于解决Arc SDE用户数超限的问题
这是一个连接SDE的数据库的源代码,如果,你要看的话,就下载吧
ArcGIS连接SDE 在数据库连接处添加数据库连接之前必须安装oracle client客户端库
ArcEngine+C#连接SDE空间数据库
二、 创建SDE数据库连接 三、 正在创建 四、 创建完成 五、 ArcMap连接数据库 六、 创建特征类(建立空间表) 七、 编辑图层 八、 添加服务 九、 注册SDE数据库和文件夹 十、 发布图层.mxd 十一、 地图发布成功 十二...
解决OracleRAC集群下创建SDE时报Stored procedures错误问题 环境:Oracle11.2.0.3 两节点RAC集群,windows server2008R2,FCSAN共享存储,ArcGIS Desktop 1031
将一个本地SHP文件和一个SDE上的表进行匹配比较,然后生成一个新的SDE要素类。其中涉级到使用AO连接ORACLE数据库的问题和如何从数据库中取出一个表的操作
实现了类型ArcCatalog的部分功能 包括sde连接树状列表、新建要素数据集、新建要素类 上传shp文件等
sde手册sde手册sde手册sde手册sde手册sde手册
SDE数据库连接,是ArcEngine开发的
总结在ArcEngine二次开发中连接sde数据库的各种方式。
AE连接SDE读取数据希望对大家有帮助,AE连接数据库~~
GIS行业的AE开发,连接SDE数据库,超像原版的Identif,还有一个尚未完成的图片查看功能.肥猫的作业,你懂的~