J'analyse actuellement une exception OutOfMemoryException survenant dans notre application lors d'une sélection SQL.OutOfMemoryException avec SQL Select
Environnement:
- x86 .NET 4.6.1 application (Pas de possibilité de l'utiliser comme x64)
- Devart.Data 5.0.1491.0
- Devart.Data.Oracle 9.1.67.0
- Entity Framework 6.0.0.0
- Oracle 12c
Qu'est-ce qui se passe?
Une requête spécifique accédant à plusieurs tables contenant beaucoup de données renvoie cette exception. Cela ne se produit qu'après avoir utilisé l'application pendant un moment, d'abord cela fonctionne bien. Une fois que l'exception se produit, cette requête échoue toujours; d'autres travaillent cependant.
L'exception provient de:
Une exception de type 'System.OutOfMemoryException' a été générée. Stack Trace:
at Devart.Data.Oracle.OracleDataReader.a()
at Devart.Data.Oracle.OracleDataReader.Read()
[...]
Quand vous faites:
context.Database.SqlQuery<T>(query, allParameters.ToArray()).ToList()
contexte: est System.Data.Entity.DbContext
requête: Est-ce la requête SQL (chaîne) nous nous calculons
paramètres: contient 1 paramètre spécifiant le nombre maximum de résultats à retruner
Analyse:
Lors du profilage de l'application avec dotMemory, il n'y a pas de grande différence entre le moment où la requête fonctionne et le moment où elle ne fonctionne pas.
travail: total 507MB, 76MB utilisé par .NET
ne fonctionne pas: 535MB, 104MB utilisé par .NET
Nous sommes loin de la 2 Go disponible pour un processus .NET.
Lorsque vous effectuez la même requête avec le « Oracle SQL Developer » la requête réussit toujours ~ 30s
Lors de l'utilisation DBMonitor, nous pouvons voir un retard de ~ 25s entre la requête et la restauration (fait en raison d'une exception) . Les requêtes et les annulations ont toutes les deux Error 'Completed successfully'.
Est-ce que quelqu'un connaît une raison ou même une solution possible à ce problème? Est-ce que DevArt pourrait faussement jeter cette exception parce que, par ex. atteint un délai d'attente? Existe-t-il un cache interne détaché du processus .NET qui se remplit après un certain temps?
J'ai d'abord posté cette question sur les forums DevArt mais je n'ai pas obtenu de réponse.
Merci d'avance pour votre aide.
Avez-vous vérifié la fragmentation du tas? https://www.jetbrains.com/help/dotmemory/2016.3/Heap_Fragmentation.html – Chris