Bruge ExecuteMultiple til at forbedre ydelsen for massedatabelastninger
Udgivet: januar 2017
Gælder for: Dynamics 365 (online), Dynamics 365 (on-premises), Dynamics CRM 2016, Dynamics CRM Online
Du kan bruge ExecuteMultipleRequest-meddelelsen til at understøtte højere overførselshastighed ved overførsel af mange meddelelser i Microsoft Dynamics 365 (online og i det lokale miljø), især i tilfælde af Microsoft Dynamics 365 (online), hvor internetventetid kan være den største begrænsende faktor.ExecuteMultipleRequest accepterer en indgående samling af meddelelser Requests, udfører hver meddelelsesanmodning i den rækkefølge, de vises i inputsamlingen og returnerer eventuelt en samling af Responses indeholdende hver meddelelses svar eller opståede fejl. Hver meddelelsesanmodning i inputsamlingen behandles i en separat databasetransaktion.ExecuteMultipleRequest udføres ved hjælp af IOrganizationService.Execute-metoden.
Generelt fungerer ExecuteMultipleRequest på samme måde, som hvis du udførte hver meddelelsesanmodning inputanmodningssamlingen separat, blot med bedre ydelse. Brug af parameteren CallerId tjenesteproxyen accepteres og vil gælde for udførslen af hver meddelelse i inputanmodningssamlingen. Plug-ins og arbejdsprocesaktiviteter udføres efter forventning for hver behandlet meddelelse.
Brugerdefineret kode i form af plug-ins og brugerdefinerede arbejdsprocesaktiviteter kan tilmed udføre ExecuteMultipleRequest. Der er imidlertid et par vigtige ting at huske på. En undtagelse, der opstår på grund af en et synkront registreret plug-in, returneres i parameteren for svarindsamlingsobjektet Fault. Hvis et plug-in udføres i en databasetransaktion, udfører plug-in'et ExecuteMultipleRequest, og en tilbageførsel af transaktionen initieres. Tilbageførslen inkluderer eventuelle dataændringer, om er resultat af anmodninger udført af ExecuteMultipleRequest.
Dette emne indeholder
Eksempel
Angiv indstillinger for kørselstidpunkt
Begrænsninger under kørsel
Håndtering af en fejl ved batchstørrelse
Eksempel
Følgende eksempelkode demonstrerer en enkelt ExecuteMultipleRequest, som udfører flere oprettelseshandlinger. Indstillinger for kørselstidspunkt kaldet Indstillinger anvendes til at styre behandlingen af anmodninger og returnerede resultater. Disse indstillinger for kørselstidspunkt behandles i det næste afsnit.
// Get a reference to the organization service.
using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri,serverConfig.Credentials, serverConfig.DeviceCredentials))
{
// Enable early-bound type support to add/update entity records required for this sample.
_serviceProxy.EnableProxyTypes();
#region Execute Multiple with Results
// Create an ExecuteMultipleRequest object.
requestWithResults = new ExecuteMultipleRequest()
{
// Assign settings that define execution behavior: continue on error, return responses.
Settings = new ExecuteMultipleSettings()
{
ContinueOnError = false,
ReturnResponses = true
},
// Create an empty organization request collection.
Requests = new OrganizationRequestCollection()
};
// Create several (local, in memory) entities in a collection.
EntityCollection input = GetCollectionOfEntitiesToCreate();
// Add a CreateRequest for each entity to the request collection.
foreach (var entity in input.Entities)
{
CreateRequest createRequest = new CreateRequest { Target = entity };
requestWithResults.Requests.Add(createRequest);
}
// Execute all the requests in the request collection using a single web method call.
ExecuteMultipleResponse responseWithResults =
(ExecuteMultipleResponse)_serviceProxy.Execute(requestWithResults);
// Display the results returned in the responses.
foreach (var responseItem in responseWithResults.Responses)
{
// A valid response.
if (responseItem.Response != null)
DisplayResponse(requestWithResults.Requests[responseItem.RequestIndex], responseItem.Response);
// An error has occurred.
else if (responseItem.Fault != null)
DisplayFault(requestWithResults.Requests[responseItem.RequestIndex],
responseItem.RequestIndex, responseItem.Fault);
}
' Get a reference to the organization service.
_serviceProxy = ServerConnection.GetOrganizationProxy(serverConfig)
Using _serviceProxy
' Enable early-bound type support to add/update entity records required for this sample.
_serviceProxy.EnableProxyTypes()
'#Region "Execute Multiple with Results"
' Create an ExecuteMultipleRequest object.
' Assign settings that define execution behavior: continue on error, return responses.
' Create an empty organization request collection.
requestWithResults = New ExecuteMultipleRequest() With
{
.Settings = New ExecuteMultipleSettings() With
{
.ContinueOnError = False,
.ReturnResponses = True
},
.Requests = New OrganizationRequestCollection()
}
' Create several (local, in memory) entities in a collection.
Dim input As EntityCollection = GetCollectionOfEntitiesToCreate()
' Add a CreateRequest for each entity to the request collection.
For Each entity In input.Entities
Dim createRequest_Renamed As CreateRequest = New CreateRequest With {.Target = entity}
requestWithResults.Requests.Add(createRequest_Renamed)
Next entity
' Execute all the requests in the request collection using a single web method call.
Dim responseWithResults As ExecuteMultipleResponse =
CType(_serviceProxy.Execute(requestWithResults), ExecuteMultipleResponse)
' Display the results returned in the responses.
For Each responseItem In responseWithResults.Responses
If responseItem.Response IsNot Nothing Then
' A valid response.
DisplayResponse(requestWithResults.Requests(responseItem.RequestIndex),
responseItem.Response)
ElseIf responseItem.Fault IsNot Nothing Then
' An error has occurred.
DisplayFault(requestWithResults.Requests(responseItem.RequestIndex),
responseItem.RequestIndex, responseItem.Fault)
End If
Next responseItem
Se Eksempel: Udfør flere anmodninger for at få vist hele prøven.
Angiv indstillinger for kørselstidpunkt
Parameteren Settings i ExecuteMultipleRequest gælder for alle anmodninger i anmodningssamlingen, som kontrollerer udførelsesfunktion og returnerede resultater. Lad og se nærmere på disse indstillinger.
Medlem af ExecuteMultipleSettings |
Beskrivelse |
---|---|
Hvis true, skal du fortsætte med at behandle den næste anmodning i samlingen, selv der er blevet returneret en fejl fra behandling af den aktuelle anmodning i samlingen. Hvis false, skal du ikke forsætte med at behandle den næste anmodning. |
|
Hvis true, skal du returnere svar fra hver behandlet meddelelsesanmodning. Hvis false, skal du ikke returnere svar. Hvis indstillingen er true, og en anmodning ikke returnerer et svar, på grund af sit design, angives ExecuteMultipleResponseItem for anmodningen til null. Men selv hvis false, er samlingen Responses ikke tom, hvis der returneres fejl. Hvis der returneres fejl, er der et svarelement i samlingen for hver behandlet anmodning, som returnerede en fejl og Fault angives for den fejl, der opstod. |
I en anmodningssamling, som indeholder seks anmodninger, hvor den tredje og femte anmodning returnerer fejl, angiver følgende tabel, hvad samlingen Responses ville indeholde.
Indstillinger |
Indhold i svarsamling |
---|---|
ContinueOnError=sand, ReturnResponses=sand |
6 svarelementer: 2 har Fault angivet til en værdi. |
ContinueOnError=falsk, ReturnResponses=sand |
3 svarelementer: 1 har Fault angivet til en værdi. |
ContinueOnError=sand, ReturnResponses=falsk |
2 svarelementer: 2 har Fault indstillet til en værdi. |
ContinueOnError=falsk, ReturnResponses=falsk |
1 svarelement: 1 har Fault indstillet til en værdi. |
En RequestIndex-parameter i svarelementet angiver det sekvensnummer, startende ved nul, i anmodningen, som svaret er tilknyttet til. I det forrige eksempel har den tredje anmodning et anmodningsindeks på 2.
Begrænsninger under kørsel
Der er flere begrænsninger relateret til brug af ExecuteMultipleRequest som beskrevet på følgende liste.
Ingen rekursion er tilladt - ExecuteMultipleRequest kan ikke aktivere ExecuteMultipleRequest. En ExecuteMultipleRequest i anmodningssamlingen genererer en fejl for anmodningselementet.
Maksimal batchstørrelse – der er en grænse for, hvor mange anmodninger, der kan tilføjes til en anmodningssamling. Hvis den grænse overskrides, udløses der en fejl, før den første anmodning overhovedet udføres. En begrænsning på 1000 anmodninger er typisk, selvom dette maksimum kan angives for udrulning af Microsoft Dynamics 365. Udrulningsindstillingen for denne grænse er BatchSize.
Begrænsning af samtidige opkald – for Microsoft Dynamics 365 (online) er der en grænse på 2 samtidige ExecuteMultipleRequest-udførelser pr. organisation. Hvis den grænse overskrides, udløses der en "Server optaget"-fejl, før den første anmodning udføres. For en installation i det lokale miljø er begrænsning som standard ikke aktiveret. Udrulningsindstillingen for denne grænse er ExecuteAsyncPerOrgMaxConnectionsPerServer.
Tip
For alle Dynamics 365-installationer kan en installationsadministrator angive eller ændre begrænsningen.
Håndtering af en fejl ved batchstørrelse
Hvad skal du gøre, hvis din inputanmodningssamling overskrider den maksimale batchstørrelse? Din kode kan ikke direkte forespørge til den maksimale batchstørrelse via installationswebtjenesten, medmindre den køres under en konto, som har rollen som installationsadministrator.
Der er heldigvis en anden metode, som du kan bruge. Hvis antallet af anmodninger i inputsamlingen Requests overskrider den maksimale tilladte batchstørrelse for en organisation, returneres der en fejl fra opkaldet ExecuteMultipleRequest. Den maksimale batchstørrelse returneres i fejlen. Din kode kan kontrollere for den pågældende værdi, ændre størrelsen for inputanmodningssamlingen, så den er inden for den angivne grænse, og gensende ExecuteMultipleRequest. Følgende kodestykke demonstrerer noget af denne logik.
catch (FaultException<OrganizationServiceFault> fault)
{
// Check if the maximum batch size has been exceeded. The maximum batch size is only included in the fault if it
// the input request collection count exceeds the maximum batch size.
if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
{
int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
if (maxBatchSize < requestWithResults.Requests.Count)
{
// Here you could reduce the size of your request collection and re-submit the ExecuteMultiple request.
// For this sample, that only issues a few requests per batch, we will just print out some info. However,
// this code will never be executed because the default max batch size is 1000.
Console.WriteLine("The input request collection contains %0 requests, which exceeds the maximum allowed (%1)",
requestWithResults.Requests.Count, maxBatchSize);
}
}
// Re-throw so Main() can process the fault.
throw;
}
Catch fault As FaultException(Of OrganizationServiceFault)
' Check if the maximum batch size has been exceeded. The maximum batch size is only included in the fault if it
' the input request collection count exceeds the maximum batch size.
If fault.Detail.ErrorDetails.Contains("MaxBatchSize") Then
Dim maxBatchSize As Integer = Convert.ToInt32(fault.Detail.ErrorDetails("MaxBatchSize"))
If maxBatchSize < requestWithResults.Requests.Count Then
' Here you could reduce the size of your request collection and re-submit the ExecuteMultiple request.
' For this sample, that only issues a few requests per batch, we will just print out some info. However,
' this code will never be executed because the default max batch size is 1000.
Console.WriteLine("The input request collection contains %0 requests, which exceeds the maximum allowed (%1)", requestWithResults.Requests.Count, maxBatchSize)
End If
End If
' Re-throw so Main() can process the fault.
Throw
End Try
Se også
Execute
OrganizationRequest
OrganizationResponse
Bruge organisationstjenesten til at læse og skrive data eller metadata
xRM-meddelelser i organisationstjenesten
Meddelelser i registreringstjenesten
Dynamics 365-meddelelser i organisationstjenesten
Importér data
Microsoft Dynamics 365
© 2017 Microsoft. Alle rettigheder forbeholdes. Ophavsret