2008-12-11 47 views
5

Tôi chưa thể tìm thấy điều này được nêu rõ ở bất kỳ đâu, nhưng một loạt các ví dụ tôi đã tìm thấy trực tuyến tuân theo những gì tôi đã làm.ODP.net có đóng con trỏ khi kết nối đóng không?

Tôi có một lớp C# sử dụng ODP.net để kết nối với một Oracle DB và chạy một thủ tục trong gói.

Gói của tôi đã lưu các thủ tục lấy thông số đầu ra con trỏ ref. Tất cả các thủ tục là mở con trỏ cho một câu lệnh chọn cụ thể.

Nếu tôi thực hiện quy trình này trực tiếp trên db oracle, thì cuối cùng tôi sẽ nhấn số lỗi con trỏ mở tối đa.

Vì vậy, tôi đã tự hỏi nếu ODP.net thực sự đóng con trỏ này đã được mở trong thủ tục của tôi?

Tôi đang sử dụng phương pháp OracleDataApaper.Fill (DataSet).

ví dụ:

DataSet ds = new DataSet(); 
OracleConnection conn = new OracleConnection(this.connStr); 
OracleCommand com = new OracleCommand("MYPKG.MYQUERY", conn); 
OracleDataAdapter adapter = new OracleDataAdapter(com); 
conn.Open(); 
com.Parameters.Add("searchParam", OracleDbType.Varchar2).Value = "myName"; 
com.Parameters.Add("outCursor", OracleDbType.RefCursor, ParameterDirection.Output); 
com.CommandType = CommandType.StoredProcedure; 

adapter.Fill(ds); 
conn.Close(); 




PROCEDURE GETALLEMAILS(searchParamIN VARCHAR2, outCursor OUT sys_refcursor) AS 
    BEGIN 
    open outCursor 
     select 
     EAEMAL as Email 
     from 
     EmailTable 
     where 
     EmailName = searchParam; 
    END GETALLEMAILS; 

Tôi chỉ sợ để lại các con trỏ mở phía sau trên DB là tất cả. Nếu bất cứ ai có thể cung cấp liên kết đến tài liệu chính thức, điều đó thật tuyệt vời!


Cập nhật:

Cảm ơn cho đầu vào. Tôi đã gọi số

com.Dispose(); 
conn.Close(); 
conn.Dispose(); 

nhưng bỏ chúng ra khỏi ví dụ của tôi.

Tôi tìm thấy bài đăng trên diễn đàn này, tuyên bố rằng phương thức OracleDataAdapter.Fill (Dataset) không giải phóng con trỏ ref sau khi phương thức Fill() đã được thực hiện.
http://www.frontoracle.com/oracle-archive/140/386140-close-ref-cursor.html

Tôi muốn tài liệu Oracle rõ ràng hơn khi mô tả quá trình này.

Trả lời

9

ODP.NET yêu cầu bạn dọn dẹp mọi thứ. Vì vậy, bạn:

  • phải vứt bỏ các trường hợp OracleParameter, vì chúng chứa các nguồn lực không được quản lý và Odp.net không làm điều này
  • phải vứt bỏ OracleCommand đối tượng, vì chúng quá chứa nguồn lực không được quản lý và đóng cửa một (!) kết nối không đóng những
  • con trỏ mở này không thể sống mà không có kết nối mở, mặc dù odp.net không được dọn dẹp sau khi kết nối đóng (hoặc bị xử lý), vì vậy bạn phải dọn dẹp chúng. kết nối đóng tất nhiên).

I.o.w .: dọn dẹp những gì bạn tạo.Nó có thể là OracleDataAdapter đã làm điều này cho bạn, nhưng đó là không rõ ràng (và các tài liệu odp.net không nói điều này, vì vậy bạn đã kiểm tra mã (không thể đọc) với phản xạ để đảm bảo. của ngón tay cái với odp.net: để tránh rò rỉ bộ nhớ, luôn luôn gọi vứt bỏ, trên tất cả mọi thứ theo thứ tự: tham số, con trỏ, lệnh, giao dịch, kết nối

+2

Tôi sẽ thêm OracleDataReader vào danh sách các đối tượng để xử lý, nếu bạn sử dụng Có vẻ như đã giải quyết được vấn đề "con trỏ mở tối đa" của chúng tôi. – Fueled

0

Tôi không chắc chắn nếu bạn đã vấp vào bài viết this và nó không áp dụng trực tiếp cho câu hỏi của bạn, nhưng nó minh họa điều tôi đã học được khi làm việc với ODP.Net: khi nghi ngờ, luôn đóng) và vứt bỏ. Mỗi phương thức tôi viết sử dụng một thể hiện của các kết nối ODP, các lệnh và/hoặc con trỏ có một mệnh đề cuối cùng xử lý mọi thứ.

Các vấn đề liên quan