Announcement

Collapse
No announcement yet.

EOutOfMemory trotz genug freien Speicher

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • EOutOfMemory trotz genug freien Speicher

    Hallo,

    ich arbeite mit dem C++Builder 6 und InterBase an einer Datanbankanwendung und habe folgendes Problem mit dem Export, bei dem es möglich sein soll, mehrere Felder optional zu exportieren. Wird keines dieser Felder mit-exportiert, gibt es auch kein Problem. Wenn alle angewählt werden, tritt eine OutOfMemory Exception auf, obwohl(!!) noch ausreichend speicher zur Verfügung steht (zuerst mit dem Taskmanagner und mit Memproof überprüft). Wird mehrmals mit wenigen optionalen Feldern exportiert, ohne das Programm zu schliessen und neu zu starten, passiert nach dem x-ten Mal das Gleiche.

    Wie's aussieht, wird die Exception immer (noch nicht ganz sicher) in der Open Methode von TIBQuery geworfen.
    Vielleicht hat jemand schonmal ein ähnliches Problem (mit TIBQuery?) gehabt?
    Oder kann sich (und auch mir ) jemand erklären, wie eine OutOfMemory Exception geworfen werden kann, wenn genug Memory frei ist?

    mfg Nico Luck

  • #2
    Bin mir jetzt sicher, dass die Exception nur in TIBQuery::Open() geworfen wird.
    Ob das ein Bug ist? Bin auch schon auf die Idee gekommen, dass der Builder evtl. die falsche Exception meldet.
    Die neusten Builder-Updates haben nichts gebracht.

    Was tun

    Comment


    • #3
      Hi,<br>
      ich kenne das Problem im Zusammenhang mit der BDE. Bei mir kommt die Meldung immer dann, wenn ich zu viele Verbindungen zur Datenbank gleichzeitig offen hab.<br>
      Bei mir hat es geholfen, die Querys zu 'recyceln', und nur wenig Query Komponenten zu verwenden.
      <br>
      Chri

      Comment


      • #4
        Hallo,
        mh, also ich lösche jede Query, wenn ich sie nicht mehr brauche.
        Aber wie recycelt man denn eine Query? Hatte vorher nur wenige und das Problem, dass die nach vielen Abfrage immer mehr Speicher verbaucht haben, weil wahrscheinlich die alten Datensätze nicht gelöscht wurden.

        Mir wurde zwar schon im InterBase Forum geholfen (EOutOfMemory wird nicht mehr geworfen, wenn TIBQuery::UniDirectional auf true gesetzt wird), würde trotzdem gerne mal wissen, wie man eine TIBQuery Komponente völlig leert. Das ganze Objekt löschen und ein neues erzeugen dauert schon ein wenig.

        danke,
        Nic

        Comment


        • #5
          Hi,<br>
          normaler weise reicht es aus, wenn Du die Query wieder mit Close() wieder schliesst. Ich hab so ca. 60 Queries und so ca 40 TUpdateSQLs auf dem Datenmodul - danach musste ich eine neue Datenbank Verbindung in einer neuen Session oeffnen.<br>
          Mit 'recyceln' meinte ich eigentlich, dass du nach einem Close() einen neuen SQL setzen kannst. Ich hab festgestellt, dass wenn Du Queries zur Laufzeit erstelltst, und diese wieder vernichtest, genau dieses Problem auftritt:
          <pre>
          while (1){
          TQuery *qu = new TQuery(this);
          ...
          delete qu;
          }
          <pre>
          ist nicht wirklich gut (war bei mir so aehnlich in einem Thread). <br>

          Chri

          Comment

          Working...
          X