begin process at 2008 07 20 15:57:24
1 213 292 membres
207 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Lecture Oracle -> Augemantation mémoire [ Base de données / Oracle ] (nicompx)

Lecture Oracle -> Augemantation mémoire le 08/08/2007 09:27:34

nicompx
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  */
publicbool 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();

      returntrue;
   }
   
catch(Exception)
   {
      Console.WriteLine("Impossible de se connecter à la base de données");
      
returnfalse;
   }
}
/*  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);
         
returnnull;
   }
   
finally
   
{
         
this.oracleReader.Close();
         
this.oracleCmd = null;  
         
this.oracleReader = null;
   }

   
return oArrResult;
}

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 09:42:18

leprov
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)

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 09:42:59

leprov
(la mise en forme bug un peu.....vivement une option d'édition)

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 09:52:26

sebmafate
Membre Club
(Admin CS)
il faut faire un Dispose() sur l'object OracleConnection et OracleCommand


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

Re : Lecture Oracle -> Augmentation mémoire le 08/08/2007 10:50:06

nicompx
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 <<

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 10:58:48

sebmafate
Membre Club
(Admin CS)

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]


Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 11:19:03

nicompx
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 <<

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 11:34:35

sebmafate
Membre Club
(Admin CS)
il faut aussi faire le Dispose sur l'objet oracleReader


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

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 12:26:35

rodcobalt22
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

Re : Lecture Oracle -> Augemantation mémoire le 08/08/2007 14:16:29

sebmafate
Membre Club
(Admin CS)
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]


Classé sous : object, squery, oraclereader, monoracle, inbcols

Participer à cet échange

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS