2011-07-01 28 views
11

Tôi đang phát triển một ứng dụng được cho là chạy trong thời gian dài và sử dụng rộng rãi cơ sở dữ liệu Oracle (11g) thông qua ODP.NET.Đã cố gắng đọc hoặc ghi bộ nhớ được bảo vệ trong Oracle 11g với ODP.NET

Nó xảy ra, mặc dù, một lần trong một thời gian (mỗi 2 hoặc 3 ngày) một System.AccessViolationException được ném bởi ODP.NET và sau đó ứng dụng cần phải được khởi động lại. Đây là dấu vết ngăn xếp của tôi:

Unhandled exception: System.Reflection.TargetInvocationException: Exception has been thrown by the target of an invocation. 
---> System.AccessViolationException: Attempted to read or write protected memory. This is often an indication that other memory is corrupt. 
at Oracle.DataAccess.Client.OpsSql.Prepare2(IntPtr opsConCtx, IntPtr& opsErrCtx, IntPtr& opsSqlCtx, IntPtr& opsDacCtx, OpoSqlValCtx*& pOpoSqlValCtx, string pCommandText, IntPtr& pUTF8CommandText, OpoMetValCtx*& pOpoMetValCtx, Int32 prmCnt) 
at Oracle.DataAccess.Client.OracleCommand.ExecuteNonquery() 

Phần còn lại của dấu vết ngăn xếp khác nhau theo thời gian và đề cập đến các cuộc gọi nội bộ từ ứng dụng của tôi.

Bây giờ, tôi đã thực hiện một số tiền hợp lý của nghiên cứu trước khi yêu cầu ở đây, nhưng tôi đã tìm thấy không có gì kết luận. Một số người khác dường như gặp vấn đề rất giống nhau, mặc dù nguyên nhân gốc rễ dường như thay đổi rất nhiều. Tôi thực sự hy vọng ai đó có một giải pháp cho điều này :-)

Trên một lưu ý không liên quan, có vẻ như ngoại lệ này có thể bỏ qua các khối catch của tôi và gây ra sự cố ứng dụng mỗi khi nó xảy ra. Đó có phải là vì nó liên quan đến vấn đề tham nhũng bộ nhớ?

Kính trọng, Andrea

chỉnh sửa: tiếp tục điều tra khiến tôi tin rằng nó có thể có giá trị bắt đầu "điều phối giao dịch phân tán" dịch vụ và xem nếu ngoại lệ ngừng bị ném. Bạn nghĩ sao?

+2

FYI lý do bỏ qua các khối thử/nắm bắt của bạn là vì nó chiếm toàn bộ dot.net khi phần không được quản lý của mã bị treo. – tsells

Trả lời

7

Đây là lỗi. Các nhà cung cấp 11.1 và 11.2 có vấn đề này. Cách duy nhất để làm được việc này là cài đặt client 11.2.0.2 và sau đó áp dụng bản vá 6.

5

Trong khi xây dựng đối tượng OracleCommand của tôi và thêm các thông số ...

tôi thấy rằng việc thay đổi từ:

select.Parameters.Add("Result", OracleDbType.RefCursor); 

để:

select.Parameters.Add("Result", OracleDbType.RefCursor, ParameterDirection.Output); 

Loại bỏ vấn đề này đối với tôi trên máy khách 11.2.0.2.

2

Chúng tôi gặp cùng AccessViolationException vì một RefCursor được khai báo là một tham số nhập thay vì Đầu ra.

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Input); 

Đây là thông điệp khắc nghiệt cho sai lầm đơn giản như vậy. Thay đổi hướng tham số đã sửa lỗi.

command.Parameters.Add("O_RECS", OracleDbType.RefCursor, null, ParameterDirection.Output); 
Các vấn đề liên quan