2012-11-29 16 views
7

Tôi đã phát triển một dịch vụ cửa sổ mà tôi đang sử dụng bộ điều khiển hẹn giờ để thực hiện một số tác vụ đã lên lịch. Sự kiện elapse bộ đếm thời gian xảy ra sau mỗi 5 phút trong đó một mục nhật ký được thực hiện bằng cách sử dụng bộ nạp log4net cho cơ sở dữ liệu Oracle.log4net Adonet Appender Connection Issue

Tất cả đều hoạt động tốt cho đến khi Máy chủ DB đóng tất cả các kết nối để sao lưu dự phòng lạnh hàng đêm. Kể từ thời điểm đó tất cả các bản ghi trong DB bị bỏ qua và không có gì được ghi lại trừ khi dịch vụ được khởi động lại mặc dù quá trình sao lưu mất ít hơn 30 phút.

Từ các bài đăng khác tôi thấy rằng log4net chỉ sử dụng một kết nối nếu bị mất thì tất cả các nhật ký tiếp theo sẽ bị hủy. Để khắc phục điều này, tôi bắt đầu sử dụng thuộc tính ReconnectOnError được đặt là true trong cấu hình của nó. Nhưng thật không may, vấn đề vẫn còn đó. Các bản ghi vẫn còn thiếu sau khi sao lưu. Tôi đã bật dò tìm và tìm thấy các lỗi sau nhưng tôi không biết cách giải quyết vấn đề này.

log4net: ERROR [CustomAdoNetAppender] Ngoại lệ trong khi văn bản cho cơ sở dữ liệu Oracle.DataAccess.Client.OracleException ORA-03.113: end-of-file trên kênh truyền thông tại Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode , OracleConnection conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src, string thủ tục) tại Oracle.DataAccess.Client.OracleException.HandleError (Int32 errCode, OracleConnection conn, thủ tục string, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx, Object src) tại Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() tại log4net.Appender.AdoNetAppender.SendBuffer (IDbTransaction dbTran, LoggingEvent [] sự kiện) tại log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] sự kiện)

và:

log4net: ERROR [CustomAdoNetAppender] Ngoại lệ trong khi văn bản cho cơ sở dữ liệu System.InvalidOperationException: Kết nối đã là một phần của một giao dịch cục bộ hoặc phân phối tại Oracle.DataAccess.Client.OracleConnection.BeginTransaction (IsolationLevel isolationLevel) tại Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction (IsolationLevel isolationLevel) tại System.Data.Common.DbConnection.System.Data. IDbConnection.BeginT ransaction() tại log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] sự kiện)

Bất kỳ trợ giúp nào về điều này được đánh giá cao !!

Trả lời

3

Cá nhân tôi coi đây là lỗi trong AdoNetAppender của log4net.

Trong log4net 1.2.11 AdoNetAppender cam kết tội lỗi ban đầu của việc giữ kết nối mở thay vì sử dụng kết nối tổng hợp. Ngoài ra tùy chọn ReconnectOnError trông bị hỏng: nó chỉ cố gắng kết nối lại nếu trạng thái kết nối hiện tại không phải là ConnectionState.Open, điều này có vẻ sai: Tôi không tin rằng trạng thái kết nối sẽ thay đổi khi có lỗi (giá trị enum ConnectionState.Broken) được ghi lại trong MSDN như được dành riêng cho các phiên bản sau của sản phẩm).

Tất cả trong tất cả, tôi khuyên bạn nên triển khai trình cài đặt tùy chỉnh của riêng mình để kết nối tổng hợp đúng cách. Nó không phải là một lớp học rất lớn vì vậy sẽ dễ dàng để nhân đôi và sửa chữa.

+0

Cảm ơn bạn đã trả lời. Có thể bắt ngoại lệ log4net ở đâu đó hoặc trong Custom Appender không? – Lucky