如果我们尝试往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连接数问题详解 #### 一、背景与概述 在GIS领域,尤其是使用ArcGIS平台时,经常遇到一个常见的技术难题——SDE(Spatial Database Engine)连接数的限制问题。这一问题不仅影响用户体验,还可能导致应用...
#### SDE连接与资源占用问题 当一个SDE连接长时间处于空闲状态时,它可能会占用一定的系统资源,特别是CPU和内存资源。这种情况下,如果系统中有大量类似的空闲连接,将可能导致资源消耗过多,进而影响到系统的整体...
标题"AE-SDE.rar_C#AE连接sde_SDE_ae"和描述中的"AE连接SDE读取数据"正是指的这一主题。 首先,SDE(Spatial Database Engine)是Esri公司开发的一种用于存储和管理地理空间数据的组件,它可以与多种数据库系统如...
SE_connection_create函数用于创建与SDE数据库的连接,而SE_connection_free用于释放连接。这些函数的返回值和参数中包含了关键信息,如连接状态、错误信息等,对于理解和诊断连接问题至关重要。 ### 结论 掌握在...
### ArcSDE命令详解——sdemon #### 一、引言 ...无论是获取服务状态、启动或关闭服务、处理连接问题还是解锁数据,`sdemon`都能提供有效的解决方案。希望本文能帮助读者更好地理解和应用这一强大工具。
在多数情况下,简单的关闭与 ArcSDE 数据库的连接即可解决问题。这是因为数据锁定可能是由仍在运行的应用程序或工具造成的。通过关闭这些应用程序,可以释放相关的锁并允许其他操作继续进行。然而,有时候这种方法并...
这条命令将强制断开所有连接到端口5151上的ArcSDE实例的客户端连接,释放资源以便进行后续操作。 ##### 6. 修改TCP保活参数 ``` sdeconfig -o alter -v TCPKEEPALIVE=TRUE -u sde -p sde -i 5151 ``` 这里使用...
- 数据库连接问题:确认数据库连接参数正确。 - **解决方法**: - 确认服务名称准确无误。 - 释放足够的系统资源。 - 检查并修正数据库连接参数。 #### 五、总结 通过上述详细的步骤,即使是初次接触ArcSDE的...
6. 释放资源:完成所有操作后,别忘了释放占用的资源,如关闭连接、释放连接池,以及调用sde_fini()结束ArcSDE库。 三、Java与ArcSDE C API的结合 尽管本文主要关注C API,但标签提到的是"java"。实际上,Esri也...
**验证连接问题**:如果在尝试连接到ArcGIS Manager或其他服务时出现“Unable to connect to Manager Service”等错误,需要检查并编辑`Server.dat`文件,位于`$ArcGIS_install_path/server/system/`目录下,确保...
为了解决这个问题,需要确保实例名称的格式符合Oracle的连接要求。 #### Cannot connect to database because the database client software failed to load 如果客户端已经正确安装了Oracle Client软件,但仍然...
9. **清理资源**:完成导入后,记得关闭所有打开的文件和数据库连接,释放占用的资源。 在实际开发中,还需要考虑错误处理、性能优化和用户界面设计等问题。例如,确保Excel文件的正确打开和关闭,处理可能存在的...
在本案例中,gsrvr进程出现的问题可能是由于其无法正确地处理客户端断开连接后留下的资源释放,导致资源被锁定而无法被其他客户端使用。 ##### 2. Network IO Error原因 Network IO Error通常指的是网络输入输出...
- **NULL 状态**:在此状态下,基站侧的CE/功率/Walsh code/SDE资源均不占用,MS与基站之间的TCH业务信道拆除,PCF和PDSN之间无A10连接,MS和PDSN之间无PPP连接。 ##### 3.2 CDMA 1X “三态”转换 CDMA 1X 分组...
最后,记得关闭连接并释放相关资源,以避免内存泄漏。 对于mdb_sde文件,这可能是一个存储在Microsoft Access(.mdb)数据库中的ArcSDE地理数据库。在C接口中,访问此类数据库通常涉及使用`ISdeTable`、`...
9. **关闭连接**:最后,记得关闭数据库连接和所有打开的资源,以释放系统资源。 在实际开发中,开发者还需要考虑性能优化、多线程处理、并发控制等高级话题。理解并熟练运用这些步骤和技巧,可以有效地实现"AE ...
- 数据源连接:`IWorkspace.OpenConnection`方法建立与数据库的连接。 10. **地理处理任务**: - 调用Geoprocessing工具:`IGeoProcessor`接口执行地理处理任务,如裁剪、合并、缓冲等。 - 监听进度:`...
当操作完成后,必须释放锁以避免死锁情况的发生。 #### 六、版本 版本管理是ArcSDE的一个重要特性,它允许用户在不同的时间点保存数据的状态。 1. **添加删除版本**:可以使用`SeVersionManager`类创建新版本或...
从技术角度讲,离子液体微波蒸馏同时萃取法(MA-SDE)利用微波辐射作为能源,离子液体作为介质。微波辐射可以有效地穿透植物物料,导致细胞壁破裂和细胞内容物的迅速释放,从而加速了有效成分的提取过程。离子液体...