ExecuteMultiple gebruiken om de prestaties voor bulkgegevenslading te verbeteren
Gepubliceerd: november 2016
Is van toepassing op: Dynamics CRM 2015
U kunt het bericht ExecuteMultipleRequest gebruiken om scenario's met een hogere doorvoer van bulkberichten te ondersteunen in Microsoft Dynamics CRM 2015 en Microsoft Dynamics CRM Online 2015 Update, met name in het geval van Microsoft Dynamics CRM Online waarin internetlatentie de grootste beperkende factor kan zijn.ExecuteMultipleRequest accepteert een invoerverzameling van het bericht Requests, voert elk van de berichtaanvragen uit in de volgorde waarin deze in de invoerverzameling worden weergegeven en retourneert optioneel een verzameling van Responses die de respons van elk bericht of de fout die is opgetreden bevat. Elke berichtaanvraag in de invoerverzameling wordt in een aparte databasetransactie verwerkt.ExecuteMultipleRequest wordt uitgevoerd met de methode IOrganizationService.Execute.
In het algemeen gedraagt ExecuteMultipleRequest zich hetzelfde als wanneer u elke berichtaanvraag in de verzameling invoeraanvragen afzonderlijk had uitgevoerd, maar dan met betere prestaties. Het gebruik van de parameter CallerId van de serviceproxy wordt gehonoreerd en toegepast op de uitvoering van elk bericht in de verzameling invoeraanvragen. Invoegtoepassingen en werkstroomactiviteiten worden uitgevoerd zoals u zou verwachten voor elk verwerkt bericht.
Aangepaste code in de vorm van invoegtoepassingen en aangepaste werkstroomactiviteiten kan zelfs ExecuteMultipleRequest uitvoeren. Er is echter een aantal belangrijke punten waarmee rekening moet worden gehouden. Een uitzondering die wordt veroorzaakt door een asynchrone geregistreerde invoegtoepassing wordt geretourneerd in de parameter Fault van het item van de responsverzameling. Als een invoegtoepassing wordt uitgevoerd binnen een databasetransactie, voert de invoegtoepassing ExecuteMultipleRequest uit en wordt het terugdraaien van transacties geïnitieerd. De terugdraaibewerking omvat alle gegevenswijzigingen die het resultaat zijn van aanvragen die zijn uitgevoerd door ExecuteMultipleRequest.
In dit onderwerp
Voorbeeld
Uitvoeringsopties tijdens runtime opgeven
Beperkingen tijdens runtime
Een fout met de batchgrootte afhandelen
Voorbeeld
In de volgende voorbeeldcode wordt een enkele ExecuteMultipleRequest gedemonstreerd die meerdere maakbewerkingen uitvoert. Er wordt gebruikgemaakt van uitvoeringsopties tijdens runtime genaamd Instellingen om de aanvraagverwerking en geretourneerde resultaten te besturen. Deze runtime-opties worden besproken in het volgende gedeelte.
// 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
Als u het volledige voorbeeld wilt bekijken raadpleegt u Voorbeeld: Meerdere aanvragen uitvoeren.
Uitvoeringsopties tijdens runtime opgeven
De parameter Settings van ExecuteMultipleRequest geldt voor alle aanvragen in de aanvragenverzameling die het uitvoeringsgedrag en de geretourneerde resultaten besturen. We gaan deze opties nu nader bekijken.
Lid ExecuteMultipleSettings |
Beschrijving |
---|---|
Indien true, wordt doorgegaan met de verwerking van de volgende aanvraag in de verzameling zelfs als een fout is geretourneerd na de verwerking van de huidige aanvraag in de verzameling. Indien false, wordt niet doorgegaan met de verwerking van de volgende aanvraag. |
|
Indien true, worden responsen geretourneerd van elke verwerkte berichtaanvraag. Indien false, worden geen responsen geretourneerd. Als true is ingesteld en een aanvraag geen respons retourneert, omdat dit zo is bedoeld, wordt de ExecuteMultipleResponseItem voor deze aanvraag ingesteld op null. Echter, zelfs indien false, is de verzameling Responses niet leeg als er fouten worden geretourneerd. Als er fouten worden geretourneerd, is er sprake van één responsitem in de verzameling voor elke verwerkte aanvraag die een fout heeft geretourneerd en wordt Fault ingesteld op de werkelijke fout die is opgetreden. |
Bijvoorbeeld bij een aanvraagverzameling die zes aanvragen bevat waarbij de derde en vijfde aanvraag fouten retourneert, geeft de volgende tabel aan wat de verzameling Responses zou bevatten.
Instellingen |
Inhoud van responsenverzameling |
---|---|
ContinueOnError=true, ReturnResponses=true |
6 responsitems: voor 2 is Fault ingesteld op een waarde. |
ContinueOnError=false, ReturnResponses=true |
3 responsitems: voor 1 is Fault ingesteld op een waarde. |
ContinueOnError=true, ReturnResponses=false |
2 responsitems: voor 2 is Fault ingesteld op een waarde. |
ContinueOnError=false, ReturnResponses=false |
1 responsitem: voor 1 is Fault ingesteld op een waarde. |
Een parameter RequestIndex in het responsitem geeft het volgnummer aan, te beginnen bij nul, van de aanvraag waaraan de respons is gekoppeld. In het vorige voorbeeld heeft de derde aanvraag een aanvraagindex van 2.
Beperkingen tijdens runtime
Er gelden verschillende beperkingen in verband met het gebruik van ExecuteMultipleRequest zoals beschreven in de volgende lijst.
Recursie is niet toegestaan - ExecuteMultipleRequest kan ExecuteMultipleRequest niet aanroepen. Een ExecuteMultipleRequest die in de aanvraagverzameling wordt aangetroffen, genereert een fout voor dat aanvraagitem.
Maximale batchgrootte - er is een limiet voor het aantal aanvragen dat kan worden toegevoegd aan een aanvraagverzameling. Als deze limiet wordt overschreden, treedt er een fout op voordat de eerste aanvraag wordt uitgevoerd. Een limiet van 1000 aanvragen is normaal, maar dit maximumaantal kan worden ingesteld voor de Microsoft Dynamics 365-installatie. De installatie-instelling voor deze limiet is BatchSize.
Beperking van gelijktijdige aanroepen– voor Microsoft Dynamics CRM Online geldt een limiet van 2 gelijktijdige ExecuteMultipleRequest-uitvoeringen per organisatie. Als deze limiet wordt overschreden, treedt er een fout "Server bezet" op voordat de eerste aanvraag wordt uitgevoerd. Voor een on-premises installatie is beperking niet standaard ingeschakeld. De installatie-instelling voor deze limiet is ExecuteAsyncPerOrgMaxConnectionsPerServer.
Een fout met de batchgrootte afhandelen
Wat moet u doen als uw verzameling invoeraanvragen de maximale batchgrootte overschrijdt? Uw code kan niet rechtstreeks de maximale batchgrootte opvragen via de installatiewebservice tenzij deze wordt uitgevoerd onder een account met de rol van installatiebeheerder.
Gelukkig is er een andere methode die u kunt gebruiken. Als het aantal invoeraanvragen in de verzameling Requests de maximale batchgrootte die is toegestaan voor een organisatie overschrijdt, wordt een fout geretourneerd via de aanroep ExecuteMultipleRequest. De maximale batchgrootte wordt geretourneerd in de fout. Uw code kan op deze waarde controleren, de grootte van de verzameling invoeraanvragen wijzigen zodat deze binnen de aangegeven limiet valt en de ExecuteMultipleRequest opnieuw indienen. Het volgende codefragment laat een deel van deze logica zien.
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
Zie ook
Execute
OrganizationRequest
OrganizationResponse
Gebruik de IOrganizationService-webservice om metagegevens of gegevens te lezen en schrijven
xRM-berichten in de organisatieservice
Berichten in de discovery-service
CRM-berichten in de organisatieservice
Gegevens importeren
© 2017 Microsoft. Alle rechten voorbehouden. Auteursrecht