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のWebサイトでこの問題の3つの可能性のある原因が示されていますが、Oracleの観点から解決できませんでした.統計的にSDEへのデータのインポートに成功した場合、1つの要素クラスをインポートするたびに、すなわち、各要素クラスのインポート時に専用のgsrvrプロセスを開き、成功率は最も高く、ほぼ95%である.成功しなかった10%は一度に200万件の表示要素類を導入したが、島を分けて、毎回50万件、すべてが無事だった.
問題は、SDEのインストール後、SDEとDBMSの間にgiomgrプロセスがあり、アクセス要求に基づいてgsrvrプロセスを構築することを管理していることを知っています.一般に、gsrvrは、SDEに関連するクエリー、記憶、削除などの操作を処理し、DBMSとの関係は「通則的に痛くなく、通則的に痛くない」であり、伝送されるデータ量が多くなると、gsrvrは風を引き始める.我々の問題は,1つの要素クラス処理が完了した後,この接続を解放する方法,すなわちgsrvrプロセスを閉じ,次の要素クラスの開始時に新しいgsrvrプロセスを再確立する方法である.この方式は確かに最も保険的だ.
問題は、SDE接続をどのように解放するかです.実際には、純粋なCOMオブジェクトを使用して書くと、ほとんど問題ではありません.ワークスペースオブジェクトをnullに設定すればいいと考えている人もいます.例えば、VBのコードを書きます.

dim pFWS as IFeatureWorkspace
set pFWS=SdeWorkspaceFactory.open()   '1
set pFWS=nothing                                       '2

Oracleの接続を見てみると、1の実行後に2つのSDEリンクがあるはずですが、2の実行後には1つの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データベースに関連するオブジェクトが1つも破棄されていない場合は、2つのSDE接続がまだ存在する場合は破棄する必要があります.
このような1つのレイヤー1つのgsrvrプロセスの方法を使用した後、FDO_は現れなかった.E_SE_DB_IO_ERRORの問題.