(MVC) MVC (2017)

InterceptorTransientErrors (повернутися на головну сторінку проєкту)

InterceptorTransientErrors.vb - Так звана RetryPolicy aбо ExetutionStrategy - тобто код повтору SQL-запитів у занадто напруженому та перевантаженому SQL-сервері, такому як MS AZURE, який просто занадто часто відмовляє клієнтському софту у запитах до SQL-серверу. При розгортанні сайту на мікрософтовському хостінгі без цього модуля сайт працювати просто не буде.



   1:  Imports System.Data.Common
   2:  Imports System.Data.Entity.Infrastructure.Interception
   3:  Imports System.Data.SqlClient
   4:  Imports System.Reflection
   5:   
   6:  Namespace Log1
   7:   
   8:      Public Class InterceptorTransientErrors
   9:          Inherits DbCommandInterceptor
  10:   
  11:          Private _counter As Integer = 0
  12:          Private _logger As ILogger = New Logger1()
  13:   
  14:          Public Overrides Sub ReaderExecuting(ByVal command As DbCommand, ByVal interceptionContext As DbCommandInterceptionContext(Of DbDataReader))
  15:              Dim throwTransientErrors As Boolean = False
  16:              If command.Parameters.Count > 0 AndAlso command.Parameters(0).Value.ToString() = "%Throw%" Then
  17:                  throwTransientErrors = True
  18:                  command.Parameters(0).Value = "%an%"
  19:                  command.Parameters(1).Value = "%an%"
  20:              End If
  21:   
  22:              If throwTransientErrors AndAlso _counter < 4 Then
  23:                  _logger.Information("Returning transient error for command: {0}", command.CommandText)
  24:                  _counter += 1
  25:                  interceptionContext.Exception = CreateDummySqlException()
  26:              End If
  27:          End Sub
  28:   
  29:          Private Function CreateDummySqlException() As SqlException
  30:              Dim sqlErrorNumber = 20
  31:              Dim sqlErrorCtor = GetType(SqlError).GetConstructors(BindingFlags.Instance Or BindingFlags.NonPublic).Single(Function(c) c.GetParameters().Count() = 7)
  32:              Dim sqlError = sqlErrorCtor.Invoke(New Object() {sqlErrorNumber, CByte(0), CByte(0), "", "", "", 1})
  33:              Dim errorCollection = Activator.CreateInstance(GetType(SqlErrorCollection), True)
  34:              Dim addMethod = GetType(SqlErrorCollection).GetMethod("Add", BindingFlags.Instance Or BindingFlags.NonPublic)
  35:              addMethod.Invoke(errorCollection, {sqlError})
  36:              Dim sqlExceptionCtor = GetType(SqlException).GetConstructors(BindingFlags.Instance Or BindingFlags.NonPublic).Single(Function(c) c.GetParameters().Count() = 4)
  37:              Dim sqlException = CType(sqlExceptionCtor.Invoke(New Object() {"Dummy", errorCollection, Nothing, Guid.NewGuid()}), SqlException)
  38:              Return sqlException
  39:          End Function
  40:      End Class
  41:   
  42:  End Namespace


Comments ( )
<00>  <01>  <02>  <03>  <04>  <05>  <06>  <07>  <08>  <09>  <10>  <11>  <12>  <13>  <14>  <15>  <16>  <17>  <18>  <19>  <20>  <21
Link to this page: //www.vb-net.com/EF-missing-FAQ/InterceptorTransientErrors.htm
<SITEMAP>  <MVC>  <ASP>  <NET>  <DATA>  <KIOSK>  <FLEX>  <SQL>  <NOTES>  <LINUX>  <MONO>  <FREEWARE>  <DOCS>  <ENG>  <CHAT ME>  <ABOUT ME>  < THANKS ME>