2012-11-29 11 views
7

Opracowałem usługę Windows, w której używam kontrolera timera do wykonywania niektórych zaplanowanych zadań. Zdarzenie upływu czasu ma miejsce co 5 minut, w którym wpis dziennika jest dokonywany za pomocą aplikacji log4net do bazy danych Oracle.log4net Adonet Appender Connection Issue

Wszystko działa dobrze, dopóki serwer DB nie zamknie wszystkich połączeń dla nocnej kopii zapasowej na zimno. Od tego czasu wszystkie dzienniki w DB są pomijane i nic nie jest rejestrowane, dopóki usługa nie zostanie ponownie uruchomiona, nawet jeśli proces tworzenia kopii zapasowej zajmie mniej niż 30 minut.

Z innych postów dowiedziałem się, że log4net używa tylko jednego połączenia, które jeśli zostanie utracone, wówczas wszystkie kolejne dzienniki zostaną odrzucone. Aby temu zaradzić, zacząłem używać zestawu atrybutów ReconnectOnError jako true w jego konfiguracji. Niestety problem nadal istnieje. Po wykonaniu kopii zapasowej nadal brakuje dzienników. Włączono śledzenie i znaleziono następujące błędy, ale nie wiem, jak rozwiązać ten problem.

log4net: ERROR [CustomAdoNetAppender] Wyjątek podczas zapisu do bazy Oracle.DataAccess.Client.OracleException ORA-03113: EOF na kanale komunikacyjnym przy Oracle.DataAccess.Client.OracleException.HandleErrorHelper (Int32 errCode , OracleConnection Conn, IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx sRC obiektu, procedura Ciąg) w Oracle.DataAccess.Client.OracleException.HandleError (Int32 errCode, OracleConnection Conn procedury String IntPtr opsErrCtx, OpoSqlValCtx * pOpoSqlValCtx sRC Object) przy Oracle.DataAccess.Client.OracleCommand.ExecuteNonQuery() w log4net.Appender.AdoNetAppender.SendBuffer (zdarzenia IDbTransaction dbTran, LoggingEvent []) w log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] wydarzenia)

oraz:

log4net: ERROR [CustomAdoNetAppender] Wyjątek podczas zapisu do bazy System.InvalidOperationException: Połączenie jest już częścią lokalnym lub transakcji rozproszonej w Oracle.DataAccess.Client.OracleConnection.BeginTransaction (IsolationLevel IsolationLevel) w Oracle.DataAccess.Client.OracleConnection.BeginDbTransaction (IsolationLevel IsolationLevel) w System.Data.Common.DbConnection.System.Data. IDbConnection.BeginT ransaction() na log4net.Appender.AdoNetAppender.SendBuffer (LoggingEvent [] wydarzenia)

Każda pomoc w tej sprawie bardzo ceniona !!

Odpowiedz

3

Osobiście uważam, że jest to błąd w log4net AdoNetAppender.

W log4net 1.2.11 AdoNetAppender popełnia grzech główny polegający na utrzymywaniu otwartego połączenia, zamiast korzystania z łączenia połączeń.

Również opcja ReconnectOnError wygląda na uszkodzoną: próbuje ponownie się połączyć, jeśli obecny stan połączenia nie jest ConnectionState.Open, co wydaje się błędne: Nie wierzę, że stan połączenia zmienia się, gdy wystąpił błąd (wartość wyliczeniowa ConnectionState.Broken jest udokumentowane w MSDN jako zarezerwowane dla przyszłych wersji produktu).

W sumie zalecam wdrożenie własnego niestandardowego aplikatora, który prawidłowo łączy pulę. To nie jest bardzo duża klasa, więc łatwo byłoby ją powielić i naprawić.

+0

Dzięki za odpowiedź. Czy jest możliwe złapanie wyjątków log4net gdzieś lub w Custom Appender? – Lucky