[ASP.NET] Problème avec une connection à la base de données

Problème avec une connection à la base de données [ASP.NET] - C#/.NET managed - Programmation

Marsh Posté le 20-01-2006 à 16:17:44    

J'ai un souci avec un site en C#.
 
Dans chaque page, j'instancie un objet "Queries", qui contient des méthodes qui lancent des requêtes dans la base de données et retournent des DataTable.
 
A la création de l'objet, ce dernier initialise une connection à la base de données, et l'ouvre (plus fait une série de tests pour vérifier que tout est OK).
 
Tout marche bien.
 
Dans le destructeur de mon objet, je fais un "cnx.Close();" puis "cnx.Dispose();" suivit d'un "cnx = null;"
 
Avec ça, à priori elle est bien morte...
 
Par contre, j'ai un problème.
 
Sur certaines pages, j'ai des Datareapeater, du et dans ces derniers, je dois refaire des requêtes.
 
Du coup, je déclare mon objet Queries en global dans la page.
 
Je l'instancie dans le Page_Load()
 
Mais je ne le détruit jamais, puisque les évènement "DataBinding" à priori sont assychrone, donc peuvent se lancer alors que Page_Load() a terminé (j'ai bon ?)
 
Seulement, après avoir constaté une chiée de problème (dont une majorité semble plutôt venir d'un problème réseau), je me suis apperçu que la mémoire dispo sur le serveur diminue à chaque chargement de page, et ne semble jamais redescendre.
De plus, au bout d'un moment, impossible de se connecter à la base.
 
Du coup j'ai l'impression que mon objet n'est jamais détruit. (me semblait pourtant que le GC était là pour ça...)
 
Là, dans le "Page_Load", j'ai rajouté à la fin "Queries = null;", histoire de la détruire correctement à la main. Seulement, j'ai pas encore testé, mais j'ai des doutes quand à la stabilité du truc contenu des évènements Databinding qui se lancent en // normalement.
 
Page_Dispose pourrait-il résoudre le problème ? Si vous pouviez m'aider un peu, là je suis dans une merde noire. J'aurais mieu fait de la faire en ASP, au moins c'est séquentiel et je maîtrise... Le truc doit impérativement fonctionner parfaitement le 30 janvier :/ Et lundi/mardi je suis en formation :sweat:
 
:cry:

Reply

Marsh Posté le 20-01-2006 à 16:17:44   

Reply

Marsh Posté le 20-01-2006 à 16:35:09    

Comme prévu, le "null" en fin de Load provoque un "NullReferenceException" de temps en temps.
 
Plutôt que dans le "Disposed", j'ai foutu ça dans le "Unload".
 
Reste plus qu'à tester, sauf que là, l'autre raison, inconnue celle-là, fait que je ne peux à nouveau plus me connecter à la base, du coup le site m'envoie chier...
 
Pffffff, c'est pas gagné. Le marché de la chèvre est un marché qui se porte bien ?

Reply

Marsh Posté le 20-01-2006 à 16:42:58    

c'est quoi ton code de connexion vers la bd? quel bd utilises tu?

Reply

Marsh Posté le 20-01-2006 à 17:05:10    

J'utilise Oracle.
 
Voici des brides de code pour comprendre mon bordel.
 

Code :
  1. namespace bci
  2. {
  3. public class Connection
  4. {
  5.  private OracleConnection cnx;
  6.  public Connection()
  7.  {
  8.   this.cnx = new OracleConnection();
  9.  }
  10.  public bool Open(string cnxString)
  11.  {
  12.   this.cnx.ConnectionString = cnxString;
  13.   try
  14.   {
  15.    cnx.Open();
  16.   }
  17.   catch (Exception e)
  18.   {
  19.    this.ex = e;
  20.    Log.WriteEntry("Base indisponible.\n" + e.Message);
  21.   }
  22.   return this.isAvailable;
  23.  }
  24.  public void Close()
  25.  {
  26.   if (this.cnx.State != ConnectionState.Closed)
  27.   {
  28.    this.cnx.Close();
  29.   }
  30.  }
  31. }
  32. }
  33. namespace bci
  34. {
  35. public class Queries
  36. {
  37.  private Connection cnx;
  38.  public Queries(string cnxString)
  39.  {
  40.   cnx = new Connection();
  41.   cnx.Open(cnxString);
  42.  }
  43.  ~Queries()
  44.  {
  45.   cnx.Close();
  46.  }
  47. }
  48. }
  49. namespace bci
  50. {
  51. public class Collection : System.Web.UI.Page
  52. {
  53.  private void Page_Load(object sender, System.EventArgs e)
  54.  {
  55.     commander = new Queries(string.Format((string) Application["cnxString"], (string) Application["dbLogin"], (string) Application["dbPass"], (string) Application["dbTNS"]));
  56.  }
  57.  private void Page_Unload(object sender, System.EventArgs e)
  58.  {
  59.   commander = null;
  60.  }
  61.  protected void Collections_ItemDataBound(object sender, RepeaterItemEventArgs e)
  62.  {
  63.         subrepeater.DataSource = commander.LoadCollection2((Decimal) Session["codsoc"], (string) dr["ssfpro"], (string) dr["sigfou"], (string) Session["sfapro"], (string) Session["destination"], (string) Session["codlan"]);
  64.  }
  65.  private void InitializeComponent()
  66.  {   
  67.   this.Collections.ItemDataBound += new System.Web.UI.WebControls.RepeaterItemEventHandler(this.Collections_ItemDataBound);
  68.   this.Load += new System.EventHandler(this.Page_Load);
  69.   this.Unload += new System.EventHandler(this.Page_Unload);
  70.  }
  71. }
  72. }


 
En gros (évidement, y'a beaucoup plus de code que ça)


Message édité par Arjuna le 20-01-2006 à 17:05:36
Reply

Marsh Posté le 20-01-2006 à 17:11:25    

En postant ça, je viens de trouver et corriger une méga-merde dansun coin. M'enfin ça déconne toujours, donc y'a pas que ça


Message édité par Arjuna le 20-01-2006 à 17:11:37
Reply

Marsh Posté le 20-01-2006 à 19:52:47    

ici je vois que tu fais la connexion en mode connecté. Qu'est ce que ça donne en mode déconnecté? cad à l'utilisation de OracleDataAdapter (si je ne me trompe pas). et l'utilisation donc d'un dataset
 
moi perso, j'aime pas les OracleConnection, j'ai jamais réussi à faire fonctionner ce truc correctement.  
J'utilise toujours Oledb
 
OledbConnection conn = new OleDbConnection(chaine_connexion);
OledbDataAdapter adap = new OleDbDataAdapter (""; conn);
adap.selectCommand = new OleDbCommand(query, conn);
DataSet data = new DataSet();
adap.fill(data);
 
moi perso je préfère ce système. Je trouve ça plus performant et plus cours au niveau programmation car un dataset est facilement manipulable. Bien sure je sais pas si cette solution pourrait résoudre ton problème

Reply

Marsh Posté le 20-01-2006 à 20:55:47    

Je vais tester ça... Demain si j'ai le courage, sinon ce sera mercredi (je suis pas au boulot lundi et mardi)
 
Ceci dit, je crois que j'ai pas réussi à faire marcher ce mode avec OracleConnection

Reply

Marsh Posté le 21-01-2006 à 11:33:50    

sinon prend des OleDb ça marche très bien...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed