-->
These old forums are deprecated now and set to read-only. We are waiting for you on our new forums!
More modern, Discourse-based and with GitHub/Google/Twitter authentication built-in.

All times are UTC - 5 hours [ DST ]



Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 13 posts ] 
Author Message
 Post subject: Ergebis einer Query-Ergebnis aktualisiert sich nicht
PostPosted: Wed Sep 14, 2005 9:40 am 
Newbie

Joined: Mon Mar 07, 2005 5:29 am
Posts: 8
Hallo ich habe einen Thread welcher eine Tabelle ueberwachen soll auf Veraenderungen!

Ich pruefe die Anzahl der vorhandenen Datensaetze bzw. Rows einfach mit einer
Query - "select count(*) from table" und wenn sich der Wert veraendert sollen die neuen
Datensaetze ausgelesen werden.

Mein Problem ist nur dass das Ergebnis der Query immer gleich dem Ergebnis der 1. Query bleibt egal ob neue Datensaetze vorhanden sind!

Ich schon verucht die session nach der Query wieder zu schliessen und eine neue zu zu erzeugen!

Weiters habe ich nach jedem Schleifendurchlauf versucht mittels
this.sessionFactory.evictQueries();
den Cache zu loeschen!

Oder auch die Einstellungen fuer die Query gesetzt!
query.setCacheable( false );
query.setForceCacheRefresh( true );

Ich habe auch den Query-Cache in der hibernate.properties deaktiviert
hibernate.cache.use_query_cache = false

Nichts davon hat geholfen! :-(

Ich bekomme immer als ResultSet der Query das 1. Ergebnis zurueck geliefert!

Hibernate version:
V2.1.7c


Top
 Profile  
 
 Post subject:
PostPosted: Wed Sep 14, 2005 12:03 pm 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Hast du schon versucht mit Transaktionen zu arbeiten?

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 2:37 am 
Newbie

Joined: Mon Mar 07, 2005 5:29 am
Posts: 8
Transaktionen beim auslesen?
Ich dachte das bringt nur beim Schreiben etwas (rollback ...)!

Wenn ich die SessionFactory jedesmal schliesse und neu erzeuge funktioniert es.
Aber das ist doch keine Lösung!

Weiters ist mir aufgefallen wenn ich jedesmal eine neue Session erzeuge und wieder schliesse ist die Query "select COUNT(*) ..." um einiges schneller, irgendwie ist das für
mich doch sehr unlogisch!

Wie kann ich das Problem loesen ohne dauernd ein SessionFactory neu zu erzeugen?

PS:
Sorry fuer die Grammatik- und Rechtschreibfehler meines oberen Beitrags.
Das kommt davon wenn man den Beitrag x-mal umformatiert! ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 3:12 am 
Newbie

Joined: Mon Mar 07, 2005 5:29 am
Posts: 8
ErikFK wrote:
Hast du schon versucht mit Transaktionen zu arbeiten?

Erik


Habs gerade mit einer Transaktion versucht und die Query wird wirklich aktualisiert!
Ich dachte immer Transaktionen sind nur fuer schreibende Operationen gut!

Kannst du mir das etwas erleutern?

Danke fuer den Tip!! :-)

PS: Falls jemand eine bessere/performantere Moeglichkeit kennt als meine "select COUNT(*)"-Abfrage um Veraenderungen an der Tabelle (neue Eintraege) zu erkennen haette ich nichts dagegen! ;-)


Top
 Profile  
 
 Post subject:
PostPosted: Thu Sep 15, 2005 6:12 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
mikr wrote:
Kannst du mir das etwas erleutern?

Ich muss zugeben, dass ich es nicht wirklich kann - aber bei deinem Problem war es einfach die letzte Möglichkeit, die ich gesehen habe, um sicher zu sein, dass wirklich wieder auf einen neuen Stand der DB zurückgegriffen wird.

Hauptsache es hilft erst einmal, später kann man es sicher auch noch verstehen :-)

Erik


Top
 Profile  
 
 Post subject: Hab das gleiche Problem!
PostPosted: Mon Sep 19, 2005 10:10 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Hab das gleiche Problem und verstehe nicht ganz euren Lösungansatz!
Ihr schließt nun nach jedem Query die SessionFactory? Und öffnet sie dann wieder neu? Wenn dem so ist, find ich diese Lösung überhaupt ned performant und es wird überall abgeraten, die SessionFactory mehrmals zu öffnen...

Zu meinem Problem:
Will ebenfalls einen Count machen. Leider ist der Result des Count immer 0. Wenn ich allerdings den SQL String, den mir Hibernate ausgibt in einem SQL-Tool eingebe, bekomme ich das richtige Ergebnis -->Also stimmt die Abfrage.
Verstehe überhaupt nicht, wieso ich als Result immer 0 bekomme. Liegt es vielleicht am Cache (Hab aber QueryCache auf Disabled...)

Hier mein Code:
Code:
public void CountNotes(int paId) throws Exception {

      Session session = HibernateUtil.currentSession();
      Transaction tx = null;
      try {
         tx = session.beginTransaction();
         String sqlstring = "Select count(n.panId) from EtPartnerNotes n where n.paId.paId=:paId";

         Query q = session.createQuery(sqlstring);
         q.setInteger("paId", paId);
            
         Integer count=(Integer)q.uniqueResult();
         
                      //HIER STEHT IMMER 0!!!
         System.out.println("RESULT CountNotes: " + count);
         tx.commit();

      }
      catch (Exception ex) {
         if (tx != null)
            tx.rollback();
         msg = bundle.getString("error");
         context.addMessage(null, new FacesMessage(
               FacesMessage.SEVERITY_WARN, msg, null));
         throw ex;
      }
      finally {
         HibernateUtil.closeSession();
      }

   }


Bitte euch nochmals genau zu erklären, wie ihr das gelöst habt.
Thx!


Top
 Profile  
 
 Post subject: Re: Hab das gleiche Problem!
PostPosted: Mon Sep 19, 2005 10:27 am 
Newbie

Joined: Mon Mar 07, 2005 5:29 am
Posts: 8
Semmerl wrote:
Hab das gleiche Problem und verstehe nicht ganz euren Lösungansatz!
Ihr schließt nun nach jedem Query die SessionFactory? Und öffnet sie dann wieder neu? Wenn dem so ist, find ich diese Lösung überhaupt ned performant und es wird überall abgeraten, die SessionFactory mehrmals zu öffnen...


Ich habe damit gemeint das bei mir 2 Ansaetze funktioniert haben:

1.) der extrem unperformante -> die SessionFactory wird immer neueroeffnet!
2.) immer vor der Query wird eine Transaktion erzeugt und nach der Query
mit commit abgeschlossen!

Warum das mit der Transaction sich beim Lesen auswirkt verstehe ich bis heute nicht!

Hoffe ich konnte dir helfen![/quote]


Top
 Profile  
 
 Post subject: Re: Hab das gleiche Problem!
PostPosted: Mon Sep 19, 2005 10:47 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
mikr wrote:
2.) immer vor der Query wird eine Transaktion erzeugt und nach der Query
mit commit abgeschlossen!


Also wenn ich mich nicht irre (siehe meinen Code) mache ich das und es funktioniert trotzdem ned? Irgendwie kommt mir das wie ein voller Bug vor...


Top
 Profile  
 
 Post subject: Re: Hab das gleiche Problem!
PostPosted: Mon Sep 19, 2005 11:20 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Also wenn ich mich nicht irre (siehe meinen Code) mache ich das und es funktioniert trotzdem ned? Irgendwie kommt mir das wie ein voller Bug vor...

Alles mit der Ruhe ;-). Das Problem liegt sicher woanders...

Ein paar Fragen:
1) Könntest du vielleicht einen neuen Thread öffnen? (nicht besonders wichtig)
2) Was für SQL generiert Hibernate? (wichtig)
3) Wie werden neue Einträge in EtPartnerNotes hinzugefügt? Werden sie in einer anderen Transaction/Session geschrieben, die sicher geschlossen ist, wenn CountNotes drankommt? (sehr wichtig)

Erik

PS: ich wäre sehr erstaunt, wenn Hibernate den Cache verwenden würde, wenn man count aufruft - aber ich habe es nicht selber programmiert :-).


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 19, 2005 11:24 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Lassen wir es doch gleich in diesem Thread, das hat eh damit zu tun oder ist es dir anders lieber?

2.) Dieses Select macht Hibernate:
Hibernate: /* Select count(n.panId) from EtPartnerNotes n where n.paId.paId=:paId */ select count(etpartnern0_.PAN_ID) as col_0_0_ from EDITOOLS.ET_PARTNER_NOTES etpartnern0_ where etpartnern0_.PA_ID=?

3.) Die Einträge, die bereits in der Datenbank sind, hab ich derzeit nicht mit Hibernate in die DB geschrieben sondern in einem SQL-Tool mit normalen SQL.

Das komische ist wie gesagt, dass wenn ich das Select ausführe, dass mir Hibernate zurückgibt, der Count stimmt!

Weißt du was da sein kann?


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 19, 2005 11:31 am 
Regular
Regular

Joined: Sat Sep 03, 2005 9:07 am
Posts: 87
Location: Graz, AUSTRIA
Problem gelöst, ich Depp hatte meine DB Abfrage nicht committet!

Sorry, dass ich euch auf die Nerven gegangen bin!


Top
 Profile  
 
 Post subject:
PostPosted: Mon Sep 19, 2005 11:39 am 
Pro
Pro

Joined: Fri Sep 02, 2005 4:21 am
Posts: 206
Location: Vienna
Semmerl wrote:
Sorry, dass ich euch auf die Nerven gegangen bin!


Kein Problem meinerseits. Ich wusste, es konnte nur eine Kleinigkeit sein und die Bestätigung, dass es so war, ist mir Entschädigung genug ;-)

Erik


Top
 Profile  
 
 Post subject:
PostPosted: Tue Sep 20, 2005 5:34 am 
Newbie

Joined: Thu Sep 08, 2005 4:53 am
Posts: 7
Location: Cologne, Germany
Auch ich nage an einem ähnlichen Problem und poste deshalb direkt mal in diesen Thread hinein:

Ich arbeite an einer Web-Anwendung, die auf einem Tomcat Server läuft und über Hibernate auf eine Oracle 9 DB zugreift.

Mittlerweile habe ich auch alles soweit implementiert, dass es wundervoll funktioniert, allerdings habe ich noch Probleme mit dem Caching/Commit.


Ich lege in meiner Anwendung neue Objekte an bzw. modifiziere die alten. Dies geschiet jeweils transaktionsbasiert, es bekommt also jedes SELECT und jedes INSERT/UPDATE eine eigene Transaktion, die auch per commit() oder im Fehlerfall per rollback() beendet wird.


Nun wird aber bei mehrmaligen Aufruf z.B. der Übersichtsseite (die eine Liste der Objekte enthält) nur bedingt der aktuelle Status der Objekte angezeigt.
Vielmehr werden durch aktualisieren der Seite in scheinbar willkürlicher Reihenfolge die bisher durchgeführten Transaktionen mal berücksichtigt und dann wieder nicht.

Die Ausgabe des Abfrage-Strings in der Eclipse-Console zeigt mir auch, dass die Abfragen nicht jedes mal ausgeführt werden, sondern offenbar teilweise auf den Cache zurück gegriffen wird.
Zum Teil werden auch nur einige Objekte der Liste neu abgefragt, die anderen bleiben bestehen.

In der Datenbank werden die Einträge alle sofort und korrekt vorgenommen.


Wie bringe ich Hibernate bei, meine Liste jedes Mal korrekt aus der DB zu laden?

Hier der Code meiner Liste (auszugsweise):
Code:
<% try {
   net.sf.hibernate.Session hibsession = HibernateUtil.currentSession();
   Transaction tx = hibsession.beginTransaction();
   hibsession.flush();
      Iterator it_me =  hibsession.createQuery("from ChangeRequest order by Id").list().iterator();
       while(it_me.hasNext()) {
          ChangeRequest me = (ChangeRequest) it_me.next();
          CrHistorie Akt =    me.getAktuell();
%>       <!-- Cr.Id = <%= me.getId() %> -->
       <%= Akt.getId().getDatum() %>       
       <%= me.getTitel() %>
       <%= me.getBeschreibung() %>
<%     }
   tx.commit();
} catch (Exception e) { %>
<h1><font color="red">Fehler beim Laden der Liste</font></h1>
<%
System.err.println("Fehler: " + e);
} %>


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 13 posts ] 

All times are UTC - 5 hours [ DST ]


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
© Copyright 2014, Red Hat Inc. All rights reserved. JBoss and Hibernate are registered trademarks and servicemarks of Red Hat, Inc.