PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbankverbindung prüfen



anunnaki
01-04-2008, 07:20
Hallo,

heute habe ich mal kein Problem, sondern ich möchte meine Lösung vorstellen und ggf. zur Diskussion stellen. Vielleicht kann man es ja besser lösen.

Bevor ich nun zum eigentliche Thema komme, noch den Hinweis, ich verwende Hibernate.

Ich habe eine Loginseite. Wenn der Benutzer die Loginseite aufruft, soll angezeigt werden, ob die Verbindung mit der der notwendigen Datenbank möglich ist. Dazu habe ich folgende Klasse erstellt:



public class HibernateUtil {
private static org.apache.log4j.Logger log=Logger.getLogger("HibernateUtil.class");
private static final SessionFactory sessionFactory;
static{
try{
//cfg.addAnnotatedClass(model.Noten.class);
sessionFactory=new AnnotationConfiguration().configure().buildSession Factory();
//sessionFactory=new Configuration().configure().buildSessionFactory();
log.info("noten;SessionFactory erstellt");
}catch(Throwable ex){
log.error("noten;Initial SessionFactory creation failed."+ ex);
throw new ExceptionInInitializerError(ex);
}
}
public static SessionFactory getSessionFactory(){
return sessionFactory;
}


In der Datei hibernate.cfg.xml habe ich den Datenbankuser und das Passwort eingetragen.

Im Loginscript rufe ich folgende Funktion auf:



public String checkDatabaseConnection(){
SessionFactory sf=HibernateUtil.getSessionFactory();
String connected="";
try{
Session s=sf.openSession();
s.beginTransaction();
connected="database_connected";
s.close();
}catch(Exception e){
connected="database_not_connected";
}
return connected;
}


Zuerst wird über HibernateUtil eine SessionFactory erstellt. Anschließen wird eine Session geöffnet und es wird versucht ein Transactinobject zu erstellen, da ich es nicht weiter brauche, verwerfe ich den Rückgabewert.
Wenn das ganze funktioniert, erhält die Variable connected den Wert "database_connected", wenn ein Fehler auftritt wird ihr "database_not_connected" übergeben. Soweit so gut oder vielleicht auch nicht gut, jedenfalls funktioniert das ganze.
Was mich wundert, ist folgendes: Egal welche Werte ich für den Datenbankuser und Passwort eingebe, eine SessionFactory wird immer erstellt.
Scheinbar werden die Datenbankbenutzerdaten, aus der hibernate.cfg.xml, immer erst beim Versuch ein Transaction-Object zu erstellen geprüft.

mfg
Anunnaki

RoCMe
01-04-2008, 13:50
Hi!


Scheinbar werden die Datenbankbenutzerdaten, aus der hibernate.cfg.xml, immer erst beim Versuch ein Transaction-Object zu erstellen geprüft.
Durchaus möglich, ich kenne mich da nicht genau aus, aber ich glaube ich hab diesen EWffekt auch schon mal beobachtet...

BTW: Du solltest den Status nicht als String darstellen. Erstmal ist ein Stringvergleich unschön im COde zu schreiben:


(if connected.equals("database_connected") {
//DO WHAT YOU WANT

und 2. dauert das sehr lange (klar, ist erst mal nicht relevant, aber es geht ums Prinzip ;)

Stattdessen solltest du vielleicht für jeden Status eine int Konstante in der HinbernateUtil Klasse definieren, z.B. so:



public class HibernateUtil {

public final int DATABASE_NOT_CONNECTED = 0;
public final int DATABASE_CONNECTED = 1;
[...]
int connect = Hibernate.DATABASE_NOT_CONNECTED;
[...]
//if Zugriff erfolgreich
connected = HibernateUtil.DATABASE_CONNECTED


Aber das sind Feinheiten ;)

mehlvogel
01-04-2008, 17:24
(OT: Oder ein enum statt int Konstanten, falls es die Java Version zulässt)

anunnaki
02-04-2008, 17:07
Hallo mehlvogel,

danke für den Hinweis. Auf die Idee Konstanten zu verwenden, wäre ich so schnell nicht gekommen.

mfg
Anunnaki