[j2EE/Tomcat] DAOFactory gebruiken in servlets

Pagina: 1
Acties:

  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Ik ben een beetje aan het proberen met J2EE en Tomcat (5). Ik heb een servlet gemaakt dat een relatie uit de database moet halen. Om verbinding te maken met de database heb ik een DAOFactory gemaakt die een RelationDAO maakt met de juiste database implementatie, in dit geval Firebird 1.5. Doel is om later nog meer databases toe te voegen.

Dit is de code van de FbDAOFactory dat verantwoordelijk is voor het maken van de verbinding:
Java:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
public class FbDAOFactory extends DAOFactory {

    private static String username = "SYSDBA";
    private static String password = "masterkey";
    private static String databaseURL = 
            "127.0.0.1:3050/var/spool/firebird/hostadmin.gdb";
    
    static FBWrappingDataSource fbDs = null;

    public static Connection getConnection() 
            throws Exception {
        
        if (fbDs == null) {
            fbDs = new FBWrappingDataSource();

            InitialContext ctx = new InitialContext();
            databaseURL = (String) ctx.lookup("java:comp/env/dao/databaseUrl");
            username = (String) ctx.lookup("java:comp/env/dao/username");
            password = (String) ctx.lookup("java:comp/env/dao/password");
            
            fbDs.setUserName(username);
            fbDs.setPassword(password);
            fbDs.setDatabase(databaseURL);
            fbDs.setBlockingTimeout(1500);
            fbDs.setType("TYPE4");
            fbDs.setPooling(true);
        }
        
        Connection c = null;
        c = fbDs.getConnection();   //fbDs != null, blijkt uit debugging
        c.setAutoCommit(false);
        return c;
        
    }
   ....
}


De code in de servlet is als volgt:
code:
1
2
3
4
String relationNumber = "1";
DAOFactory daoFactory =DAOFactory.getDAOFactory();  //<-- aangepast. 
RelationDAO relationDAO = daoFactory.getRelationDAO();
Relation relation = relationDAO.findRelationByRelNumber(relationNumber);
Bovenstaande code heeft in de servlet de nodig catches om eventuele excepties af te vangen.

Maar als ik nu vanuit de RelationFbDAO de getConnection aanroep krijg ik de foutmelding
code:
1
java.sql.SQLException: Could not obtain connection during blocking timeout (1500 ms)


Komt dit door de static declaratie? Want als ik de FBWrappingDataSource steeds opnieuw maak in de RelationDAO werkt het wel. Maar door steeds opnieuw het object te maken is er geen connection pooling. Kan iemand mij zeggen hoe dit beter kan/moet?

[ Voor 7% gewijzigd door FendtVario op 18-11-2004 21:22 ]

www.fendt.com | Nikon D7100 | PS5


  • Pinobigbird
  • Registratie: Januari 2002
  • Laatst online: 16:07

Pinobigbird

doesn't share food!

Omdat getRelationDAO() static is gedeclareerd, moet je deze alsvolgt aanroepen:
(correct me if I'm wrong)
Java:
1
RelationDAO relationDAO = DAOFactory.getRelationDAO();

Joey: Nice try. See the Netherlands is this make believe place where Peter Pan and Tinkerbell come from.
https://kattenoppasleiderdorp.nl
PV: 3080Wp ZO + 3465Wp NW = 6545Wp totaal 13°tilt


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Nee, klopt niet helemaal. DAOFactory is de standaard klasse waarvan FbDAOFacotory overge-erft is. Met daoFactory.getRelationDAO krijg je een interface terug van de juiste implementatie. de aanroep is goed, alleen de regel er boven moest naar de klasse.

Het geheel is opgezet volgens het Data Access Object Pattern van J2EE. Zie de sun patterns website voor het ontwerp.

[ Voor 5% gewijzigd door FendtVario op 18-11-2004 21:54 . Reden: juiste naam pattern ]

www.fendt.com | Nikon D7100 | PS5


  • FendtVario
  • Registratie: Januari 2002
  • Laatst online: 12-05-2025

FendtVario

The leader drives Vario!

Topicstarter
Probleem gefixed. Lag niet aan de methode van aaroepen maar een schrijffoutje in de databaseURL. 8)7

In de web.xml stond
code:
1
127.0.0.1:3050/var/spool/firebird/hostadmin.gdb
ipv. Heb nu de default poort weggehaald. Lag waarschijnlijk aan de dubbelle punt. Maar nu staat er
code:
1
127.0.0.1:/var/spool/firebird/hostadmin.gdb
en het werkt.

www.fendt.com | Nikon D7100 | PS5


  • zneek
  • Registratie: Augustus 2001
  • Laatst online: 08-02-2025
zou je niet beter dat stukje zoekwerk uit je servlet halen? imho niet de plaats om met DAO te gaan rommelen. Ik zou eerder een facade objectje opzetten wat al het gegoochel met DAO en queries/finders voor je doet.

En vraag Alarmnummer maar eens om je uit te leggen hoe je mbv bijv Spring de boel netjes aan elkaar lijmt.