Her er resultatet så, hvor der er en connectionpool. Bemærk at udover:
http://jakarta.apache.org/commons/pool/http://jakarta.apache.org/commons/dbcp/så skal denne også bruges:
http://jakarta.apache.org/commons/collections/Klassen bør nok deles op i to klasser, således at forespørgsler trækker på en connection/pool klasse istedet.
Bør man iøvrigt klargør alle de preparedstatement? indtil videre optager det jo 6 connections i poolen, og applikationen er jo langt fra færdig endnu.
Men som i skriver så bør et næste skridt i forbindelse med performance nok omhandle optimering af databasen.
Nu er spørgsmålet godt nok lukket, men hvis i har lyst må i meget gerne komme med forbedrings forslag :)
***********Database.java************
import java.sql.*;
import javax.servlet.*;
import org.apache.log4j.*;
import java.sql.Connection;
import java.sql.Statement;
import java.sql.ResultSet;
import java.sql.SQLException;
import org.apache.commons.pool.ObjectPool;
import org.apache.commons.pool.impl.GenericObjectPool;
import org.apache.commons.dbcp.ConnectionFactory;
import org.apache.commons.dbcp.PoolingDriver;
import org.apache.commons.dbcp.PoolableConnectionFactory;
import org.apache.commons.dbcp.DriverManagerConnectionFactory;
public class Database
{
private static boolean poolReady = false;
private final static Logger dbLogger = Logger.getLogger("DatabaseLogger");
private ServletContext application = null;
private Connection conn=null; //our connnection to the db - presist for life of program
private PreparedStatement pstmLoginOk;
private PreparedStatement pstmFindesBruger;
private PreparedStatement pstmOpretBruger;
private PreparedStatement pstmRegLogin;
private PreparedStatement pstmRegLogin2;
private PreparedStatement pstmRegLogin3;
private ResultSet rsFindesBruger;
private ResultSet rsLoginOk;
private ResultSet rsRegLogin;
public Database(ServletContext application) throws Exception // note more general exception
{
this.application = application;
}
public boolean open()
{
if(poolReady==true) return true;
else
{
try
{
String drv=null, url=null, bru=null, adg=null;
if(application!=null){
drv = application.getInitParameter("dbDriver");
dbLogger.info("Database.open() - dbDriver indlæst fra web.xlm");
url = application.getInitParameter("dbUrl");
dbLogger.info("Database.open() - dbUrl indlæst fra web.xlm");
bru = application.getInitParameter("dbBruger");
dbLogger.info("Database.open() - dbBruger indlæst fra web.xlm");
adg = application.getInitParameter("dbAdgangskode");
dbLogger.info("Database.open() - dbAdgangskode indlæst fra web.xlm");
}
if(drv==null)
{
drv = "com.mysql.jdbc.Driver";
dbLogger.info("Database.open() - dbDriver indlæst fra metoden");
}
if(url==null)
{
url = "jdbc:
mysql://localhost/Banankasse"; dbLogger.info("Database.open() - dbUrl indlæst fra metoden");
}
if(bru==null)
{
bru = "root";
dbLogger.info("Database.open() - dbBruger indlæst fra metoden");
}
if(adg==null)
{
adg = "";
dbLogger.info("Database.open() - dbAdgangskode indlæst fra metoden");
}
dbLogger.info("Database.open() - Loading underliggende JDBC driver");
Class.forName(drv);
dbLogger.info("Database.open() - Loading underliggende JDBC driver - Done");
dbLogger.info("Database.open() - Driver sættes op");
poolReady = setupDriver(url+"?"+"user="+bru+"&password="+adg);
dbLogger.info("Database.open() - Driver sat op: "+poolReady);
dbLogger.info("Database.open() - Creating connection.");
pstmLoginOk = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("SELECT brugernavn FROM BKBruger WHERE brugernavn=? AND password=?");
pstmFindesBruger = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("SELECT email FROM BKBruger WHERE brugernavn=?");
pstmOpretBruger = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("INSERT INTO BKBruger(brugernavn,password,fornavn,efternavn,email,foedselsdato,mobil,fastnet,mailBanan,mailForum,regDato,sidsteLogin,billede, antalLogin) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?)");
pstmRegLogin = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("UPDATE BKBruger SET sidsteLogin= ? WHERE brugernavn = ?");
pstmRegLogin2 = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("SELECT antalLogin FROM BKBruger WHERE brugernavn = ?");
pstmRegLogin3 = DriverManager.getConnection("jdbc:apache:commons:dbcp:banankasse").prepareStatement("UPDATE BKBruger SET antalLogin = ? WHERE brugernavn = ?");
dbLogger.info("Database.open() - prepared statements indlæst");
printDriverStats();
}
catch(ClassNotFoundException e){
dbLogger.error("Database.open() - Problemer med databasen - ClassNotFoundException: "+e);
poolReady=false; //der er ikke forbindelse til poolen, prøv at oprette den senere
return false;
}
catch(SQLException e){
dbLogger.error("Database.open() - Problemer med databasen - SQLException: "+e);
poolReady=false; //der er ikke forbindelse til poolen, prøv at oprette den senere
return false;
}
catch(Exception e){
dbLogger.error("Database.open() - Problemer med databasen - Exception: "+e);
poolReady=false; //der er ikke forbindelse til poolen, prøv at oprette den senere
return false;
}
return true;
}
}
/**
* Luk forbindelse til db
* @throws java.sql.SQLException
*/
public void shutdown() throws SQLException
{
if(poolReady!=false)
{
try
{
pstmLoginOk.close();
pstmFindesBruger.close();
pstmOpretBruger.close();
pstmRegLogin.close();
pstmRegLogin2.close();
pstmRegLogin3.close();
shutdownDriver();
dbLogger.info("Database.shutdown() - forbindelse til database lukket");
}
catch (Exception e)
{
dbLogger.error("Database.shutdown() - Problemer med at lukke forbindelse til database: "+e);
}
}
}
/**
* Ud fra det indtastede brugernavn og password logges brugeren ind, hvis der
* findes en bruger med det pågældende brugernavn og password
* @return
* @param password
* @param brugernavn
*/
public synchronized boolean loginOk(String brugernavn, String password)
{
boolean loggetInd = false;
try{
if (open())
{
pstmLoginOk.setString(1, brugernavn);
pstmLoginOk.setString(2, password);
rsLoginOk = pstmLoginOk.executeQuery();
if (rsLoginOk.next())
{
loggetInd = true; //korrekt! brugeren er logget ind.
dbLogger.info("Database.loginOk() - Bruger logget ind: "+brugernavn);
}
else
{
loggetInd = false;
dbLogger.info("Database.loginOk() - Forkert brugernavn eller password - brugernavn: "+brugernavn);
}
}
}
catch(SQLException e){
dbLogger.error("Database.loginOk() - Problemer med at tjekke login: "+e);
}
finally
{
try
{
rsLoginOk.close();
pstmLoginOk.clearParameters();;
}
catch(SQLException e)
{
dbLogger.error("Database.loginOk() - Problemer i finally med rsLoginOk.close() og/eller pstmLoginOk.clearParameters(): "+e);
}
}
return loggetInd;
}
/**
* Ud fra det indtastede brugernavn undersøges det om et tilsvarende findes
* i forvejen.
* @return
* @param brugernavn
*/
public synchronized boolean findesBruger(String brugernavn)
{
boolean findesBruger = true;
try
{
if(open())
{
pstmFindesBruger.setString(1, brugernavn);
rsFindesBruger = pstmFindesBruger.executeQuery();
if(rsFindesBruger.next())
findesBruger = true;
else
findesBruger = false;
}
}
catch(SQLException e)
{
dbLogger.error("Database.findesBruger() - SQLException: "+e);
}
finally
{
try
{
rsFindesBruger.close();
pstmFindesBruger.clearParameters();
}
catch(SQLException e)
{
dbLogger.error("Database.findesBruger() - Problemer i finally med rsFindesBruger.close() og/eller pstmFindesBruger.clearParameters(): "+e);
}
}
return findesBruger;
}
/**
* Ud fra bønnen Login oprettes brugeren i BKBruger.
* @return
* @param nytPassword
* @param login
*/
public synchronized boolean opretBruger(Login login, String nytPassword)
{
boolean opretBrugerOk=false;
if (open())
{
try
{
pstmOpretBruger.setString(1, login.getBrugernavn());
pstmOpretBruger.setString(2, nytPassword);
pstmOpretBruger.setString(3, login.getFornavn());
pstmOpretBruger.setString(4, login.getEfternavn());
pstmOpretBruger.setString(5, login.getEmail());
pstmOpretBruger.setDate(6, login.konverterTilDate(login.getFoedselsdato()));
pstmOpretBruger.setString(7, login.getMobil());
pstmOpretBruger.setString(8, login.getFastnet());
pstmOpretBruger.setInt(9, (login.getMailBanan() ? 1 : 0));
pstmOpretBruger.setInt(10, (login.getMailForum() ? 1 : 0));
pstmOpretBruger.setTimestamp(11, new Timestamp(new java.util.Date().getTime()));
pstmOpretBruger.setDate(12, null);
pstmOpretBruger.setString(13, "billedesti");
pstmOpretBruger.setInt(14, 0);
pstmOpretBruger.executeUpdate();
pstmOpretBruger.clearParameters();
dbLogger.info("Database.opretBruger() - Bruger oprettet korrekt - brugernavn: "+login.getBrugernavn());
opretBrugerOk=true; //oprettelse lykkedes!
}
catch(SQLException e){
dbLogger.error("Database.opretBruger() - Problemer med opretBruger - SQLException: "+e);
opretBrugerOk=false;
}
catch(Exception e){
dbLogger.error("Database.opretBruger() - Problemer med opretBruger - SQLException: "+e);
opretBrugerOk=false;
}
finally
{
try
{
pstmOpretBruger.clearParameters();
}
catch(SQLException e)
{
dbLogger.error("Database.opretBruger() - Problemer i finally med pstmOpretBruger.clearParameters(): "+e);
}
}
}
else
{
opretBrugerOk=false;
}
return opretBrugerOk;
}
/**
* I BKBruger opdateres felterne sidsteLogin og antalLogin
* sidsteLogin sættes ud fra tidspunktet på det aktuelle login
* antalLogin tælles een op.
* @param brugernavn
*/
public synchronized void regLogin(String brugernavn)
{
if(open())
{
try
{
pstmRegLogin.setTimestamp(1, new Timestamp(new java.util.Date().getTime()));
pstmRegLogin.setString(2,brugernavn);
pstmRegLogin.executeUpdate();
pstmRegLogin.clearParameters();
dbLogger.info("Database.regLogin() - sidsteLogin opdateret");
pstmRegLogin2.setString(1, brugernavn);
rsRegLogin = pstmRegLogin2.executeQuery();
if(rsRegLogin.next())
{
int antalLogin = rsRegLogin.getInt("antalLogin");
antalLogin++;
pstmRegLogin3.setInt(1, antalLogin);
pstmRegLogin3.setString(2, brugernavn);
pstmRegLogin3.executeUpdate();
pstmRegLogin3.clearParameters();
dbLogger.info("Database.regLogin() - antalLogin opdateret");
}
}
catch(SQLException e)
{
dbLogger.error("Database.regLogin() - Problemer med regLogin - SQLException: "+e);
}
finally
{
try
{
rsRegLogin.close();
pstmRegLogin3.clearParameters();
pstmRegLogin2.clearParameters();
pstmRegLogin.clearParameters();
}
catch(SQLException e)
{
dbLogger.error("Database.regLogin() - Problemer i finally med rsRegLogin.close(), pstmRegLogin3.clearParameters(), pstmRegLogin2.clearParameters() og/eller pstmRegLogin3.clearParameters(): "+e);
}
}
}
}
public static boolean setupDriver(String connectURI) throws Exception {
//
//Objektpool, der tjener som den aktuelle pool af connections
//
// GenericObjectPool instans bruges, selvom enhver ObjectPool
// implementation ville have være tilstrækkelig
//
ObjectPool connectionPool = new GenericObjectPool(null);
//
// ConnectionFactory som poolen vil bruge til at lave connections.
//
ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(connectURI,null);
//
// PoolableConnectionFactory, indpakker(wraps) de "rigtige" connections,
// der blev lavet af ConnectionFactory sammen med klasser, der
// implementerer pooling funktionalitet
//
PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory,connectionPool,null,null,false,true);
//
// PoolingDriveren oprettes...
//
Class.forName("org.apache.commons.dbcp.PoolingDriver");
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//
// ...og registreres sammen med poolen.
//
driver.registerPool("banankasse",connectionPool);
//
// nu kan denne streng bruges til at tilgå poolen med connections "jdbc:apache:commons:dbcp:example"
//
if(connectionPool!=null && connectionFactory!=null && poolableConnectionFactory!=null && driver!= null)
return true;
else
return false;
}
/**
* Udskriver antal active og idle connection i poolen
* @throws java.lang.Exception
*/
public static void printDriverStats() throws Exception {
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
ObjectPool connectionPool = driver.getConnectionPool("banankasse");
System.out.println("NumActive: " + connectionPool.getNumActive());
System.out.println("NumIdle: " + connectionPool.getNumIdle());
}
/**
* Lukker pooldriveren
* @throws java.lang.Exception
*/
public static void shutdownDriver() throws Exception {
PoolingDriver driver = (PoolingDriver) DriverManager.getDriver("jdbc:apache:commons:dbcp:");
driver.closePool("banankasse");
}
}