Lecture Oracle -> Augemantation mémoire

nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009 - 8 août 2007 à 09:27
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 - 8 août 2007 à 14:16
Bonjour,

Je developpe une application C# avec VS2003 Framework1.1.
Cette application lit en boucle dans une base de données Oracle (client9.2).
Je me suis rendu compte que la mémoire augmentait sans arrêt. (+- 150ko / seconde)
Je suppose que j'oublie de libérer quelque chose!?
Pouvez-vous m'aider?

Merci pour votre aide.

>> NiCoMpX <<

Voici le code de l'application:

/********************************/
/*                    MAIN                              */
/********************************/
string sQuery;

object[,] resultat;

classOracle monOracle =
new classOracle();

try
{
   sQuery = "select MSG_ID, BODY, PROVID, NUMBER_GSM, SHORTCODE, TIMESTAMP, DATESTART from SMS_MO";
   
if(monOracle.connect())
   {
         
while(
true)
         {

            System.Threading.Thread.Sleep(100);
//Pause de 100ms
            resultat = monOracle.getQueryResult(sQuery);
            resultat =
null;

         }

         monOracle.deconnect();
   }
}

catch
{
}

finally
{
   monOracle.deconnect();
}

/********************************/
/*                    classOracle                      */
/********************************/

/*  Fonction de connexion  */
public
bool connect()
{

   try
   {
      
this.sUser = "******";

      this.sPassword = "******";

      this.sServeur = "INFOTEC";

      this.oracleCnx.ConnectionString = "Password=" +
this.sPassword + ";User ID=" +
this.sUser + ";Data Source=" + sServeur;

      this.iNbCols = 0;

      this.iNbRows = 0;
      oracleCnx.Open();

      return
true;
   }
   
catch(Exception)
   {
      Console.WriteLine("Impossible de se connecter à la base de données");
      
return
false;
   }
}
/*  Fonction de lecture  */
public Object[,] getQueryResult(
string sQuery)
{

   
this.oracleCmd =
new OracleCommand(sQuery,
this.oracleCnx);
   
this.oracleReader =
null;
   
this.oracleReader =
this.oracleCmd.ExecuteReader();
   Object[,] oArrResult;

   this.iNbRows = 0;
   
this.iNbCols =
this.oracleReader.FieldCount;

   // Initialisation du tableau de retour
   while (
this.oracleReader.Read()) {
this.iNbRows++; }
   oArrResult =
new Object[
this.iNbRows,iNbCols];
   
   
// Remplissage du tableau de retour
   try
   {
         
this.oracleReader =
this.oracleCmd.ExecuteReader();
         
int i = 0;
         
while (
this.oracleReader.Read())
         {
               
for(
int j=0; j<
this.iNbCols; j++)
               {   
                     oArrResult[i,j] = oracleReader.GetOracleValue(j);
               }
               i++;
         }
   }
   
catch(OracleException oe)
   {
         
this.gestionErreur(oe);
         
return
null;
   }
   
finally
   {
         
this.oracleReader.Close();
         
this.oracleCmd =
null;  
         
this.oracleReader =
null;
   }

   
return oArrResult;
}

9 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 août 2007 à 09:42
Il me semble qu'il n'y a rien d'anormal dans ton code. Cependant, les instructions
this.oracleCmd =
null;  

this.oracleReader =
null;
ne libèrent pas la mémoire, elles rendent simplement les objets éligibles pour la garbage collection....
En bref, il est possible que ton occupation mémoire augmente le temps que le garbage collector fasse son office, puis rechute après. En bref, tu dois vérifier ton occupation mémoire sur du long terme pour voir si tu as effectivement un problème, pas jsute sur quelques secondes (peut etre que cest ce que tu as fait? dans ce cas ca me semble étonnant)
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
8 août 2007 à 09:42
(la mise en forme bug un peu.....vivement une option d'édition)
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 09:52
il faut faire un Dispose() sur l'object OracleConnection et OracleCommand

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
8 août 2007 à 10:50
J'ai ajouté un Dispose() sur l'objet OracleCommand mais j'ai toujours le même problème.
La mémoire augmente sans arrêt. ( 1Mo / minute )

>> NiCoMpX <<
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 10:58
hum... pourquoi retourner un object[,] dans ta fonction de lecture ? pourquoi pas tout simple un arraylist ?
ca t'éviterait de lancer 2 fois ta requête... non ?


 


pas non plus la peine de mettre 2 fois la méthode de déconnection... c'est suffisant dans le finally !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
nicompx Messages postés 107 Date d'inscription lundi 16 janvier 2006 Statut Membre Dernière intervention 15 juillet 2009
8 août 2007 à 11:19
Re,

Je viens de faire les adaptations que tu vous m'avez suggéré et j'ai toujours le problème.
Je pense que ca viens de l'objet oracleReader mais pourtant il est bien fermé dans le finally!?
Avez-vous d'autres idées????

D'avance merci.

>> NiCoMpX <<
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 11:34
il faut aussi faire le Dispose sur l'objet oracleReader

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
cs_rodcobalt22 Messages postés 193 Date d'inscription dimanche 10 février 2002 Statut Membre Dernière intervention 16 février 2016
8 août 2007 à 12:26
A mon avis cela pourrais être une raison d'utiliser les using sur les oraccle connection, oracle reader, ...

Le using permet de notifer la destruction des objets lorsqu'il ne sont plus utilisé, cad en fin d'accolade de ton using

va voir la msdn pour ça :

http://msdn.microsoft.com/library/fre/default.asp?url=/library/FRE/csspec/html/vclrfcsharpspec_8_13.asp

juste au hasard voir si la gestion mémoire ne serait pas plus optimum avec cette méthode
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
8 août 2007 à 14:16
le using permet d'appeler le Dispose() à la sortie du bloc... rien de plus !

mais c'est un bon exemple pour l'appliquer.

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
0
Rejoignez-nous