关于释放SDE连接的问题

如果我们尝试往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问题。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
请使用 Cookie 登录 如何获取Cookie, 请参见 README.txt 文件。 账号密码登录失效,待修复。 最新情况: status=403 临时解决办法,将 aria2 配置 里的 每下载最大连接数 改为 7,如果问题不能解决, 尝试 使用 saldl 下载 免登录失效 v0.1.0055 11月13 更新 - 这是一个临时办法 修复使用 saldl 下载时可能出现的错误 请注意 !此版本不同先前版本,使用前请仔细阅读 README 文件,并进行必要的设置,否则右键下载不可选 !在使用本软件时,请先关闭 Fiddler 当下载文件夹里已有同名文件时,aria2 会自动重命名,但 saldl 不会下载。 关于cookie登录出现 -6 错误,请先确认你复制的是否是 BDUSS 的值,如果是,请再确认是不是用 第三方账号登录后获取的,第三方账号登录可能会出现问题,但不完全确定。 默认已将 每下载最大连接数 和 每下载每服务器最大连接数 修改为 16, 同时 每队列最大并行任务数 修改为 3 个,你可以根据自己的实际情况进行修改 默认下载位置 %USERPROFILE%\Downloads 在 工具/选项 里进行修改 暂停下载 直接关闭该窗口或按 Ctrl+C。若要继续下载,只需再次下载该文件。 当程序显示“需要注意”时,如果速度很慢,应停止使用该帐号继续下载。休息一天或换个号 登录下载无法避免被限,每天可能10g左右流量限制。 config 文件夹里的 Yixun.ini 是配置文件(比如下载目录),SAM 保存着登录账号数据, Download.ini 是下载参数配置 aria2 文件夹里的 aria2.conf 和 aria22.conf(高级版)是 aria2 配置 saldl 文件夹里的 saldl.ini 是 saldl 配置 ! 更新到新版时,可以将这些配置复制到最新版对应目录,可以避免重新设置(v0.1.0050 先前版本 与此 Download.ini 不兼容 )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值