Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbankverbindung
Hi, hab ne Frage.
Also ich hab ein Programm, das ne DB benutzt. Habe dazu eine Datenbank-Klasse, wo ich dann halt einige Methoden hab, um mit der Datenbank zu kommunizieren.
Allerdings wird es ja wahrscheinlich vorkommen, daß ich diese Klasse öfters benutze (weil ich ja an verschiedenen Stellen diese DB-Methoden brauche), und wenn ich dann den Aufbau der Verbindung zur Datenbank in den Konstruktor der Klasse packe, würde ja jedesmal die Verbindung neu aufgebaut werden.
Kann ich das dann verhindern, indem ich das mit static kennzeichne, also etwa so:
class Database
{
static Connection conn;
public Database(String Host, String Name, String User, String Pass)
{
String Url = "jdbc:sapdb://" + Host + "/" + Name;
Class.forName("com.sap.dbtech.jdbc.DriverSapDB");
conn = DriverManager.getConnection(Url,User,Pass);
}
}
Würde dann, auch wenn ich die Klasse öfters mal benutze, nur einmal die Verbindung aufgebaut werden?
Oder gibt es dafür andere bessere Lösungen?
Zum Beispiel wenn ich am Anfang
Database db = new Database();
aufrufe und dann db immer an die anderen Klassen die ich noch benutze übergeben?
Ach ja noch ne Frage, wie ist das wenn ich zum Beispiel den Host, DBNamen, Usernamen und Passwort aus ner Datei auslese
Wenn ich die dann auhc mit
Static String Host, Name, User, Pass
deklariere und im Konstruktor die dann auslese, wird das dann auch nur das erste mal, wenn ich die klasse aufrufe, ausgelesen, oder wie muss ich das genau machen?
Mhm, Ok, ich seh grad,´Du kannst es mit static machen, in dem Du eine static Verbindungsvariable benutzt, ja. Ist aber nicht so ganz sauber, denke ich, da Du Dich ja irgendwann auch wieder um das Schliessen der Verbindung kümmern musst. Normalerweise eben im erzeugenden Objekt.
Hie noch ein paar andere Möglichkeiten:
Entweder öffnest Du die Verbindung zur DB ausserhalb der Klasse und übergibst dann das Verbindungsobjekt dem Konstruktor Deiner Klasse,
oder aber Du baust in deine Klasse mehrere Konstruktoren ein,
also einmal für ein bereits bestehendes Verbindungsobjekt,
dann noch für Host, Name, User, Pass. So kannst Du je nach Bedarf eine bestehende Verbindung übernehmen, oder eine neue
Verbindung erstellen.
Ich würde allerdings zur ersten Lösung tendieren, denn wenn Deine Klasse eine Verbindung erzeugt, sollte sie der Sauberkeit halber auch dafür sorgen, daß diese, sobald Dein Objekt nicht mehr gebraucht wird, auch wieder geschlossen wird. Damit könnten dann aber Deine restlichen Objekte, die ebenfalls mit dieser Verbindung arbeiten, Probleme bekommen.
Damit sollte sich dann eigentlich auch das Problem mit dem Auslesen der Datei gegeben haben.
Ich hoffe, das hilft Dir weiter.
Cya Jack
Whitestar
07.06.2002, 09:19
ich hab mal eine frage an dich.....
1.) was verwendest du für eine datenbank?
2.) liegt die auf deinem pc oder auf einem server.....
vielen dank
Whitestar: Hab hier halt nen Linux-Rechner im Netzwerk, da läuft Apache, JServ etc und ich nutze die SapDB (www.sapdb.org)
Jack: Also ich will es ja so haben, daß am anfang des Programms die Verbindung aufgemacht wird, dann von allen Objekten, die im Programm vorkommen, benutzt werden kann, und am ende wieder geschlossen wird...
Meinst du also, daß ich am anfang die Verbindung aufbaue, und an alle Objekte, die ich aufrufe, diese Verbindungsvariable übergebe?
Also beispielsweise so:
public class Test
{
public Connection conn;
public static void main (String[] args)
{
Database db = new Database(conn);
}
}
class Database
{
public Database(Connection conn)
{
// Benutzernamen auslesen etc...
String Url = "jdbc:sapdb://" + Host + "/" + Name;
Class.forName("com.sap.dbtech.jdbc.DriverSapDB");
conn = DriverManager.getConnection(Url,User,Pass);
}
public Database()
{ }
}
Und dann eben conn an alle weiteren Objekte, die ich aufrufe, übergeben?
StoreMaster
07.06.2002, 17:29
also ich würde sagen, dass das sicher die sauberere lösung ist als die statische...
Whitestar
07.06.2002, 21:57
also auf deutsch du hast deinen eigenen server....oder?
hast du vielleicht eine ahnung wo ich webspace bekomme wo ich meine db raufspielen kann? dann müsste ich nähmlich myswl installieren....nur leider weiß ich noch nicht wo ich das machen soll......
bzgl. deiner frage ich glaube auch das es so besser ist wie du jetzt beschrieben hast...
Hmmm oder daß er im Konstrukt oder einfach testet, ob die DB-Verbindung schon besteht? Das wäre doch auch ne möglichkeit, oder?
Whitestar
07.06.2002, 23:07
was meinst du den?
hmm egal, die Idee war sowieso net so gut ;)
Naja muss einfach ma ein bissle rumprobiern :)
Sodele, ich hab das jetzt soweit mal geschrieben, denkt ihr das ist in Ordnung so?
import java.io.*;
import java.sql.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class SrvDB extends HttpServlet
{
public static Connection conn;
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
resp.setContentType("text/html");
PrintWriter out = resp.getWriter();
out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n\n" +
"<html>\n" +
"<head><title>Datenbankinhalt</title></head>\n" +
"<body>\n" +
"<br><br>\n");
try {
Database db = new Database("localhost","DbName","DbUser","DbPass");
out.println(db.getMetaData() + "<br>--------<br>");
TestQuery qry = new TestQuery();
out.println(qry.Query());
db.CloseConn();
}
catch(ClassNotFoundException exc) { out.println(exc); }
catch(SQLException exc) { out.println(exc); }
out.println("</body>\n" +
"</html>");
out.close();
}
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException
{
doGet();
}
}
class TestQuery
{
public String Query()
throws ClassNotFoundException, SQLException
{
Database db = new Database();
return db.giveTableData("TabName");
}
}
class Database
{
private static Connection conn;
private static Statement stmt;
public Database()
{
this.conn = SrvDB.conn;
}
public Database(String Host, String Name, String User, String Pass)
throws ClassNotFoundException, SQLException
{
String Url = "jdbc:sapdb://" + Host + "/" + Name;
Class.forName("com.sap.dbtech.jdbc.DriverSapDB");
SrvDB.conn = DriverManager.getConnection(Url,User,Pass);
this.conn = SrvDB.conn;
stmt = conn.createStatement();
}
protected void finalize()
throws ClassNotFoundException, SQLException
{
stmt.close();
conn.close();
}
public void CloseConn()
throws ClassNotFoundException, SQLException
{
SrvDB.conn.close();
}
public String getMetaData()
throws ClassNotFoundException, SQLException
{
DatabaseMetaData dmd = conn.getMetaData();
return "DrvURL: " + dmd.getURL() + " - DrvName: " + dmd.getDriverName() + " - DrvVersion: " + dmd.getDriverVersion();
}
public String giveTableData(String TblName)
throws ClassNotFoundException, SQLException
{
String Result = "Inhalt der Tabelle <b>" + TblName + "</b>:<br><br>";
ResultSet rslt = stmt.executeQuery("SELECT * FROM " + TblName);
while (rslt.next())
{
Result = Result + rslt.getInt("id") + ": " + rslt.getString("title") + "<br>";
}
rslt.close();
return Result;
}
}
zum thema kann ich nix neues mehr beitragen,
aber @ whitestar: www.tripod.de
hat mysql und php support
Whitestar
10.06.2002, 15:58
ja aber das porblem ist dass man auf tripold nicht von aussen zugreifen kann.......weiß jemand einen anbieter vom man mit java auf die db zugreifen kann??
Original geschrieben von Whitestar
ja aber das porblem ist dass man auf tripold nicht von aussen zugreifen kann.......weiß jemand einen anbieter vom man mit java auf die db zugreifen kann??
schau mal bei www.mycgiserver.com
bin aber net sicher
Whitestar
10.06.2002, 19:43
hi!
danke für den url
aber diese hp unterstützt ja kein sql oder?:eek:
da kann man zwar mit servlets arbeiten aber mit sql???
oder irre ich mich da.....:mauer:
Whitestar
12.06.2002, 09:38
Hi Leute!
Ich hab mein Problem gelöst!
Mit www.freesql.com kann man sich ohne weiters mit Java connecten und es ist gratis noch dazu !
also vielen Dank nochmals für Eure Hilfe!
vBulletin® v3.8.6, Copyright ©2000-2012, Jelsoft Enterprises Ltd.