J'utilise ODP.Net version 11.1.0 pour insérer des données dans une base de données, et je constate une fuite de mémoire. Si je commente le code ci-dessous, il s'en va. Ce code est appelé des milliers de fois dans mon application, et je peux regarder le nombre d'octets dans tous les tas croître régulièrement pendant qu'il s'exécute. cmdStr contient une instruction d'insertion qui insère dans une table avec 375 colonnes. Les champs sont tous NUMBER à l'exception de deux - l'un est un DATE, et l'autre est un VARCHAR2 (20). Y a-t-il autre chose que je dois faire pour nettoyer OracleCommand? Aucune exception n'est levée ici - la commande insert est réussie à chaque fois.Fuite de mémoire avec OracleCommand
Editer: J'ai essayé de déplacer l'instruction return, et cela n'a eu aucun effet comme prévu - l'utilisation est vraiment un bloc try-finally. Mise à jour: J'ai utilisé CLRProfiler pour voir ce qui utilise la mémoire, et c'est un tas d'objets chaîne, ~ 2800 d'entre eux. Leurs références sont détenues par des objets HashTable appartenant à Oracle.DataAccess.Client.ConnDataPool. Pourquoi ODP.NET les conserve-t-il?
try
{
using (OracleCommand cmd = new OracleCommand(cmdStr, conn))
{
cmd.CommandTimeout = txTimeout;
int nRowsAffected = cmd.ExecuteNonQuery();
errMsg = null;
return EndpointResult.Success;
}
}
catch (OracleException e)
{
return BFOracleAdapter.HandleOracleException(e, out errMsg);
}
catch (Exception e)
{
errMsg = "OracleInsertOperation Exception: " + e.Message;
return EndpointResult.Error;
}
Tout semble bien dans ce code. Questions: 1. Êtes-vous correctement disposé l'objet OracleConnection? 2. Qu'y a-t-il dans les chaînes que vous pouvez voir dans CLRProfiler? En tant que hack, je pense qu'il existe un moyen de fermer/réinitialiser toutes les connexions dans le pool de connexion ... – ConsultUtah