Saya memiliki proses yang berjalan lama. Saya ingin mencegah kebocoran sumber daya atau koneksi basis data yang tidak benar.
Pada interval selama proses saya ingin melakukan ini:
- dapatkan pabrik ruang kerja ArcSDE (Oracle)
- buka ruang kerja dari pabrik (saat itu saya mendapatkan koneksi database terbuka)
- dapatkan kelas fitur atau tabel yang ada di ruang kerja,
- query kelas fitur atau tabel, lewati kursor yang menjalankan bisnis saya
kemudian lepaskan / tutup semuanya sehingga :
- Koneksi basis data dan kunci tabel dari perspektif ArcSDE / Oracle (seperti diungkapkan oleh sesuatu seperti "sdemon -o info -I pengguna" atau kueri dari tabel sde.table_locks) ditutup / dirilis.
- proses ini tangguh untuk ArcSDE / Oracle restart (yaitu, saya tidak meninggalkan sesuatu yang menggantung yang tidak akan berfungsi setelah restart setiap malam)
- RCW, referensi COM, dan memori dilepaskan.
Pada dasarnya, karena sifat proses yang berjalan lama, saya ingin benar-benar yakin saya tidak punya kebocoran sumber daya atau koneksi yang tidak benar, dan proses saya dapat bertahan hidup dengan ArcSDE / Oracle restart .
Saya telah melihat diskusi seperti:
- Apa aturan untuk melepaskan ArcObjects dari memori di .NET?
- apa yang harus diketahui oleh setiap programmer arcobjects tentang lajang
- cara merilis referensi COM
- berinteraksi dengan benda tunggal
Dan ini , dari mana saya kutip
Setiap pabrik ruang kerja memiliki kumpulan ruang kerja aktif yang terhubung saat ini yang direferensikan oleh aplikasi. Ketika salah satu metode Open * yang sebelumnya terdaftar dipanggil, pabrik ruang kerja memverifikasi jika ruang kerja sebelumnya telah dibuka dengan set properti yang cocok. Jika demikian, referensi ke instance yang ada dikembalikan.
Semua yang menyarankan kepada saya bahwa saya harus melepaskan (misalnya kelas ComReleaser atau setara Marshal.ReleaseComObject ()), mungkin dalam urutan ini:
- kursor
- Featureeclass / tabel
- ruang kerja
- pabrik ruang kerja
Lalu ada diskusi seperti ini di mana orang melakukan semua itu, dan mungkin bahkan menaburkan di System.GC.Collect () dan koneksi database mereka masih hidup.
Oh guru, apa obat bius lurus terakhir tentang ini?
sumber
Jawaban:
Anda telah membahas banyak aspek dalam pos Anda. Namun untuk memperluas pertanyaan Anda, selalu ikuti pola ini:
Kemudian panggilan
System.GC.Collect()
untuk memaksa pengumpul sampah untuk menghapus referensi ke DBMS.Urutan rilis harus Cursor, Fitur (IFeature), FeatureClasses, Workspaces dan ArcObjects lainnya instantiated.
Aplikasi ArcGIS Desktop dan ArcEngine adalah STA (aplikasi berulir tunggal). Tidak aman atau disarankan untuk menggunakan ArcObjects di seluruh thread (Pekerja); Seseorang dapat menggunakan serialisasi dan deserialisasi objek untuk mencapai ini. Untuk perincian lebih lanjut, lihat di sini .
sumber