PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datenbankzugriff - Connection pooling


Glemi
24.11.2003, 23:35
Guten Tag allerseits
ich bin recht unerfahren, was jsp betrifft; deshalb stellen sich mir folgende Fragen:

Ich möchte eine jsp-seite bauen, die mit einer Datenbank interagiert. Wenn ich jetzt die verbindung in einem Skriptlet (<% ... %>) aufbaue, geschieht das doch jedesmal, wenn eine Anfrage hereinkommt. Wäre es nicht sinnvoller, die Verbindung bei initialisierung des jsp-servlets aufzubauen und bei seiner Zerstörung zu schliessen? Ich habe versucht die init-Methode in einer Deklaration (<%! ... %>) zu überschreiben, aber das darf ich nicht, weil in der Superklasse (org.apache.jasper.runtime.HttpJspBase) die init-Methode als final deklariert ist.

Die Fragen sind also erstens:
Gibt es irgendeine Möglichkeit, auf die initialisierung des Servlets einzuwirken, dass aus einer JSP-Seite gemacht wird?
...und zweitens:
Wie werden normalerweise Datenbankverbindungen in jsp-seiten gehandhabt?

Ich hoffe auf Hilfe und danke im Voraus auf allfällige Antworten!


MrEasy
25.11.2003, 10:18
hast natürlich recht, dass bei nem folgenden ansatz bei jedem init die db auf und beim destroy wieder zugemacht wird:

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;

public final class YourClass extends HttpServlet {

Connection con = null;

public void init() throws ServletException {

String url = getServletContext().getInitParameter("url");
String uid = getServletContext().getInitParameter("uid");
String pwd = getServletContext().getInitParameter("pwd");

try {
//Register the JDBC driver
Class.forName("oracle.jdbc.driver.OracleDriver");
} catch( Exception e ) {
e.printStackTrace();
}//end catch

//Get a connection to the database
try {
con = DriverManager.getConnection(url, uid, pwd);
} catch( Exception e ) {
e.printStackTrace();
}//end catch

}//end init()

public void destroy() {
try {
//Close the connection to the database
con.close();
} catch( Exception e ) {
e.printStackTrace();
}
}

public void doGet(HttpServletRequest req,
HttpServletResponse res)
throws ServletException, IOException{

try {
[...]
Statement st = con.createStatement();
[ more JDBC code ]
}
catch (SQLException e) {
[ ... ]
}
}


um das zu verhindern, solltest du die db-connection in einem pool halten, dazu hab ich grad kein beispiel... kommt noch :)

MrEasy
25.11.2003, 23:09
hier findest du nen ausführlichen artikel zum thema connection pooling speziell auch für jsp's: http://webdevelopersjournal.com/columns/connection_pool.html

sollte eigentlich alle fragen beantworten, ansonsten poste noch mal

admin-aktion: thread-topic dem thema angepasst ;)

Klaus1980
10.03.2005, 11:03
Ich habe eine Frage zu dem Connection Pooling.

Das Prinzip habe ich soweit verstanden und habe das jetzt soweit auch mal ausprobiert wie in dem Artikel beschrieben.

Nur eine, vielleicht dumme, Frage:


public class _login extends HttpServlet {
private DBConnectionManager connMgr;

public void init(ServletConfig conf) throws ServletException {
super.init(conf);
connMgr = DBConnectionManager.getInstance();
}

protected void doGet(...) {

Connection con = connMgr.getConnection("mysql");

... }


Das steht nun soweit in meinem "_login" Servlet. Muss ich nun in jedem weiteren Servlet in meiner Anwendung ebenfalls die fettgedruckten Sachen reinhauen ? Oder wie geht das da von statten ?

MrEasy
23.03.2005, 00:48
ach herrjeh, voll den alten thread ausgegraben ;) da kann einer die such-funktion benutzen ;)

also: das fett gedruckte musst du in jedem servlet, in dem du den DBConnectionManager benutzen willst auch machen: ja

Alternative wäre das object in der session zu speichern, oder in einer klasse für alle servlets verfügbar zu machen