-->
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.  [ 14 posts ] 
Author Message
 Post subject: Tomcat und HibernateUtil
PostPosted: Thu Nov 17, 2005 9:25 pm 
Newbie

Joined: Thu Nov 17, 2005 8:36 pm
Posts: 4
Ich habe hier einen Tomcat 5.5, verwende Hibernate 2.X (habe es auch mit 3.X versucht), dazu eine MySql Datenbank 4.X und nach einiger Zeit gibt mir der Tomcat den Geist auf. Leider habe ich auf den Tomcat keinen direkten Zugriff. Lokal alles bestens - auf dem Server funktioniert meine kleine Applikation eine gewisse Zeit.
Ich verwende folgendes Pattern für die Verbindung:


Code:
import net.sf.hibernate.HibernateException;
import net.sf.hibernate.Session;
import net.sf.hibernate.cfg.Configuration;

/**
* Configures and provides access to Hibernate sessions, tied to the
* current thread of execution.  Follows the Thread Local Session
* pattern, see {@link http://hibernate.org/42.html}.
*/
public class HibernateSessionFactory {

    /**
     * Location of hibernate.cfg.xml file.
     * NOTICE: Location should be on the classpath as Hibernate uses
     * #resourceAsStream style lookup for its configuration file. That
     * is place the config file in a Java package - the default location
     * is the default Java package.<br><br>
     * Examples: <br>
     * <code>CONFIG_FILE_LOCATION = "/hibernate.conf.xml".
     * CONFIG_FILE_LOCATION = "/com/foo/bar/myhiberstuff.conf.xml".</code>
     */
    private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";

    /** Holds a single instance of Session */
    private static final ThreadLocal threadLocal = new ThreadLocal();

    /** The single instance of hibernate configuration */
    private static final Configuration cfg = new Configuration();

    /** The single instance of hibernate SessionFactory */
    private static net.sf.hibernate.SessionFactory sessionFactory;

    /**
     * Returns the ThreadLocal Session instance.  Lazy initialize
     * the <code>SessionFactory</code> if needed.
     *
     *  @return Session
     *  @throws HibernateException
     */
    public static Session currentSession() throws HibernateException {
        Session session = (Session) threadLocal.get();

        if (session == null) {
            if (sessionFactory == null) {
                try {
                    cfg.configure(CONFIG_FILE_LOCATION);
                    sessionFactory = cfg.buildSessionFactory();
                }
                catch (Exception e) {
                    System.err.println("%%%% Error Creating SessionFactory %%%%");
                    e.printStackTrace();
                }
            }
            session = sessionFactory.openSession();
            threadLocal.set(session);
        }

        return session;
    }

    /**
     *  Close the single hibernate session instance.
     *
     *  @throws HibernateException
     */
    public static void closeSession() throws HibernateException {
        Session session = (Session) threadLocal.get();
        threadLocal.set(null);

        if (session != null) {
            session.close();
        }
    }

    /**
     * Default constructor.
     */
    private HibernateSessionFactory() {
    }

}



Ich habe es auch mit der HibernateUtil versucht, komme aber auch damit auf keinen grünen Zweig - wäre nett, wenn mir jemand seine funktionierende Variante präsentieren kann - ohne an der Tomcat Konfiguration schrauben zu müssen - denn genau darauf habe ich wie gesagt keinen Zugriff.

Zuletzt noch eine Bitte und damit bin ich wahrscheinlich nicht ganz allein - bitte keine Verweise auf irgendwelche "schlauen" Artikel - einfach nur eine funktionierende Variante für einen Tomcat und was ich da Schritt für Schritt zu tun habe - denn nicht alle sind in Hibernate so bewandert und wenn sie sich noch so viel Mühe geben.
Vielen Dank für Eure Hilfe.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 3:48 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
Als Fan der Satzes "Lerne die Leute lieber fischen, als ihnen Fische zu bringen" werde ich Dir hier wohl leider nicht wirklich aushelfen können ...

Vor allem weil es mir alleine mit der Beschreibung "nach einiger Zeit gibt mir der Tomcat den Geist auf" schlicht weg und einfach nicht möglich ist. Es gibt sicherlich mehr als nur einen Grund warum der Tomcat seinen Geist aufgeben kann.

"Schlaue Artikel" bringen einen zwar meist weiter, aber das scheint so für Dich nicht interessant zu sein ...

Aber gut ... um auf Deine Frage zu antworten:

Wenn es auch mit dem "original HibernateUtil" nicht klappt, würde ich nach anderen Ursachen suchen. Wenn es bei Dir auf Deinem lokalen Tomcat funktioniert, liegt es vielleicht doch am anderen Tomcat.
Ohne den Fehler einzugrenzen wird Dir hier wohl keiner helfen können. Vor allem wenn der Fehler, wenn ich das richtig gelesen habe, auch mit dem "original HibernateUtil" auftritt.

Ja, ich weiß, das wolltest Du nicht hören ... aber mehr ist mir beim besten Willen nicht möglich.

gtx
curio


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 3:48 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
ahja ... wer sagt Dir überhaupt, dass es am "HibernateUtil" liegt, dass der Tomcat seinen Geist aufgibt?


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 6:16 am 
Newbie

Joined: Thu Nov 17, 2005 8:36 pm
Posts: 4
Nun dann muss ich es eben anders formulieren. Mit Geist aufgeben meine ich , dass der Tomcat nicht mehr antwortet. Eine leere Seite und das wars.
Es hilft definitiv nur noch ein Neustart des Tomcat.

Es scheint, dass meine Sessions nicht geschlossen werden. Ich habe jetzt einmal auf dem Server mitgeloggt und dann bekomme ich folgendes:

Code:
23:55:08,413 DEBUG ConnectionManager: running Session.finalize()
23:55:08,413 DEBUG ConnectionManager: running Session.finalize()
23:55:12,100  WARN ConnectionManager: unclosed connection, forgot to call close() on your session?
23:55:12,100  WARN ConnectionManager: unclosed connection, forgot to call close() on your session?


Die Frage ist jetzt, warum wird die Session nicht geschlossen - meine Abfrage sieht so aus.

Code:
   
  Session hibernatesession = HibernateSessionFactory.currentSession();
  Transaction tx = hibernatesession.beginTransaction();
   .......
   tx.commit();
   hibernatesession.close();


Mache ich da irgendetwas falsch ?

@curio: Hätte ich nicht schon tagelang selbst versucht durch Lesen hier eine Antwort zu finden, würde ich hier nicht posten - sicher gibt es zig Möglichkeiten warum ein Tomcat abrauchen kann - aber es liegt definitiv an meiner HibernateSessionFactory und mit der HibernateUtil in Minimalform passiert genau dasselbe oder alle die über einen Proxy gehen erhalten folgende Meldung:
Das Gateway hat die Verbindung mit der Website, auf die Sie versuchen zuzugreifen , verloren.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 6:16 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
http://www.hibernate.org/114.html


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 6:28 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
@sledge
Also zum einen würde ich die "close"-Methode nicht direkt an der Hibernate-Session aufrufen sondern an der "HibernateSessionFactory".

Als nächstes ist die Frage, ob es sinnvoll ist die HBSession nach jedem Datenbankzugriff zu schliessen ... (sofern Du das machst, wonach mir Dein Beispielcode aussieht).

Schau Dir mal das "Open-Session-In-View"-Pattern an (http://www.hibernate.org/43.html), nebst dem Link den Dir Christian gegeben hat. Vielleicht ist ja was für Dich dabei ... Ob Du das "commit/rollback" wirklich im Filter machst ist ja ne andere Sache ... aber zumindest kannst Du offene HibernateSessions dort schließen ...

gtx
curio


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 9:44 am 
Newbie

Joined: Thu Nov 17, 2005 8:36 pm
Posts: 4
Vielen Dank erst einmal für Eure Antworten. Ich habe jetzt zunächst einmal den Lösungsansatz von Christian probiert.
Ich habe alles so eingetragen wie hier beschrieben.

http://www.hibernate.org/114.html

so weit so gut. Dazu habe ich dann die HibernateUtil von hier übernommen.

http://www.hibernate.org/42.html#A11

Was mir in der ganzen Anleitung dann als Newbie fehlt ist wie ich denn nun wirklich eine Transaktion starte. Also habe ich es dann zuerst so probiert:

Code:
      
                                                                                                          Session hibernatesession=HibernateUtil.getSessionFactory().openSession();
Transaction tx = hibernatesession.beginTransaction();
.
.
tx.commit();
HibernateUtil.getSessionFactory().close();


Hat auch zunächst funktioniert. Tabelle wurde aufgebaut etc..
Dann die Überraschung: Ich klicke mehrmals auf Refresh im Browser und dann geht auf dem lokalen Tomcat gar nichts mehr - ich sehe die berühmte Sanduhr im Browser .... und das geht bis zum Sankt "Nimmerleinstag".
Läßt sich beliebig oft reproduzieren - mehr als 10 Refreshs schafft er nicht.

Mein nächster Versuch war dann anstatt openSession() getCurrentSession() zu verwenden - worauf ich dann folgende Exception erhalte:
Code:
No TransactionManagerLookup specified


und jetzt vielleicht noch was total stranges - Mein user hatte auf der Datenbank ALL PRIVILEGES nachdem ich die erste Abfrage startete war meine Tabelle auf die ich zugriff leer - Ihr habt richtig gelesen - wie auch immer er diese Tabelle einfach deleted - das konnte ich beliebig oft reproduzieren - bis ich ihm die die Rechte auf SELECT,INSERT,UPDATE,DELETE eingeschränkte. Danach waren wenigstens meine Daten noch da.

Das ist alles total strange...


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 10:33 am 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
Wie waere es mit dem Tutorial aus der Anleitung? Oder http://hibernate.org/42.html


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 10:51 am 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
ich muss Christian da Recht geben ... es macht mir den Eindruck, als wüsstest Du nicht genau, was Du überhaupt machst (nicht böse gemeint!).
Von daher wirklich erst einmal durch ein Tutorial arbeiten ... solch "stochern im Nebel" führt selten zum erhofften Ergebnis.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 1:44 pm 
Newbie

Joined: Thu Nov 17, 2005 8:36 pm
Posts: 4
Sorry dieses "gestochere im Nebel" kommt vielleicht auch daher, dass es hier an ein paar griffigen Beispielen definitiv fehlt, die man sich einfach mal downloaden und installieren kann. Ich will jetzt nichts Falsches behaupten, aber eine kleine Webanwendung die als .war Datei downloadbar ist, habe ich hier nicht gefunden.

Es würde mir weitaus mehr helfen, als ein Link auf ein Tutorial - und das ist jetzt nicht böse gemeint, sondern soll einfach mal eine konstruktive Kritik sein.

Der langen Rede kurzer Sinn - ich für meinen Teil bedanke mich für Eure Antworten, auch wenn sie mich bisher nicht großartig weiter gebracht haben.

Vielleicht kann mir doch noch jemand sagen, was ich in dem Tomcat Tutorial falsch gemacht habe..... viel kann es wohl nicht sein, aber leider fehlt auch in diesem Beispiel wieder ein Teil des Codes ... (der Zugriff auf die Factory)

.... hier kann man geteilter Ansicht sein, aber für mich nicht verwunderlich, wenn man dann als Einsteiger unter die Räder kommt.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 3:13 pm 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
@sledge
es gibt sehr wohl eine Beispielanwendung ... sie nennt sich "Caveat Emptor".
Eventuell hilft sie Dir ja weiter --> http://caveatemptor.hibernate.org/

Ich würde Dir ja wirklich gerne weiter helfen, kann es aber einfach nicht. Ich kenne Deine Anwendung nicht und ich fürchte Dein Problem sitzt tiefer. Das "HibernateUtil" funktioniert ja auch in sonstigen Projekten einwandfrei (auch in meinem - zwar leicht angepasst aber vom Prinzip her identisch).

Hast Du denn mal versucht in einem Filter die aktuell verwendete HibernateSession zu schließen? Tritt Dein Fehler dann immer noch auf? Oder poste doch einmal soviel Code, dass man das auch ein bischen besser nachvollziehen kann ...

Ich persönlich bin mit einer leicht abgeänderten Fassung des "Open Session in View"-Patterns sehr gut zurecht gekommen ...

gtx
curio


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 3:23 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
CaveatEmptor hat keine Webanwendung. Dafuer gibts ca. 25 andere Tutorials mit und ohne Code auf www.hibernate.org.


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 4:46 pm 
Expert
Expert

Joined: Tue Oct 05, 2004 9:45 am
Posts: 263
hupps *schäm und in die Ecke stell*

sorry. Aber man sieht zumindest den Zugriff auf Hibernate *schäm*


Top
 Profile  
 
 Post subject:
PostPosted: Fri Nov 18, 2005 6:38 pm 
Hibernate Team
Hibernate Team

Joined: Mon Aug 25, 2003 9:11 pm
Posts: 4592
Location: Switzerland
In CVS gibts jetzt ein neuen Teil im Tutorial der zeigt wie man ein Servlet schreibt...


Top
 Profile  
 
Display posts from previous:  Sort by  
Forum locked This topic is locked, you cannot edit posts or make further replies.  [ 14 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.