Tôi có một quá trình lâu dài. Tôi muốn ngăn chặn rò rỉ tài nguyên hoặc kết nối cơ sở dữ liệu giả mạo.
Tại các khoảng thời gian trong quá trình tôi muốn làm điều này:
- có được một nhà máy không gian làm việc ArcSDE (Oracle)
- mở một không gian làm việc từ nhà máy (tại đó tôi nhận được kết nối cơ sở dữ liệu mở)
- lấy một lớp đối tượng hoặc bảng hiện có trên không gian làm việc,
- truy vấn lớp tính năng hoặc bảng, lặp qua con trỏ làm việc của tôi
sau đó phát hành / đóng mọi thứ sao cho :
- Kết nối cơ sở dữ liệu và khóa bảng theo quan điểm của ArcSDE / Oracle (được tiết lộ bởi một cái gì đó như "sdemon -o information -I users" hoặc truy vấn của bảng sde.table_locks) đã bị đóng / phát hành.
- quá trình này có khả năng phục hồi khi khởi động lại ArcSDE / Oracle (nghĩa là tôi sẽ không để lại thứ gì đó không hoạt động sau khi khởi động lại hàng đêm)
- Bất kỳ tài liệu tham khảo RCW, COM và bộ nhớ đều được phát hành.
Về cơ bản, do tính chất kéo dài của quy trình, tôi muốn thực sự chắc chắn rằng tôi không bị rò rỉ tài nguyên hoặc các kết nối giả mạo và quy trình của tôi có thể tồn tại khi khởi động lại ArcSDE / Oracle .
Tôi đã thấy các cuộc thảo luận như:
- Các quy tắc để phát hành ArcObjects từ bộ nhớ trong .NET là gì?
- những gì mọi lập trình viên arcobjects nên biết về singletons
- Cách phát hành tài liệu tham khảo COM
- tương tác với các đối tượng singleton
Và cái này , từ đó tôi trích dẫn
Mỗi nhà máy không gian làm việc duy trì một nhóm các không gian làm việc đang hoạt động, hiện đang được kết nối được ứng dụng tham chiếu. Khi bất kỳ phương thức Open * nào được liệt kê trước đó được gọi, nhà máy không gian làm việc sẽ xác minh nếu một không gian làm việc đã được mở trước đó với một tập các thuộc tính phù hợp. Nếu vậy, một tham chiếu đến thể hiện hiện tại được trả về.
Tất cả đều gợi ý cho tôi rằng tôi nên phát hành (ví dụ: lớp ComReleaser hoặc vòng lặp Marshal.ReleaseComObject ()), có thể theo thứ tự này:
- con trỏ
- bàn / bàn
- không gian làm việc
- không gian làm việc
Sau đó, có những cuộc thảo luận như thế này nơi mọi người làm tất cả những điều đó, và thậm chí có thể rắc vào System.GC.Collect () và kết nối cơ sở dữ liệu của họ vẫn tồn tại.
Oh gurus, dope thẳng cuối cùng về điều này là gì?