Bonjour à tous,

Je ne sais pas si je suis dans la bonne section, mais bon, je tente quand même.

Je développe une application web en JSF 2.2/Tomcat 7 qui se connecte à un Mysql. Cette dernière utilise une cinquantaine de DAOs fait maison qui sont en scope APPLICATION.
Ces DAOs hérite tous d'une classe BaseDao dans laquelle est initié la connexion à la base de données d'une manière assez dégueulasse et qui, je pense, peut poser pas mal de problème de performances:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
 
public abstract class BaseDao implements Serializable {
 
    private transient static Connection connection;
 
    static {
        try {
            Context initCtx = new InitialContext();
            DataSource ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/db");
            connection = ds.getConnection();
        } catch (NamingException ex) {
        } catch (SQLException ex) {
        }
    }
    protected Connection con;
    protected transient final ResourceBundle requests;
    protected transient final Logger log = Logger.getLogger(BaseDao.class);
    protected transient final ResourceBundle msg = ResourceBundle.getBundle("msg");
 
    public BaseDao() throws SQLException {
        this.requests = ResourceBundle.getBundle("requests");
        this.con = BaseDao.connection;
    }
 
    protected PreparedStatement prepareStatement(final String requestName) throws SQLException {
        checkConnection();
        return con.prepareStatement(requests.getString(requestName));
    }
 
    protected PreparedStatement prepareRawStatement(final String request) throws SQLException {
        checkConnection();
        return con.prepareStatement(request);
    }
 
    protected PreparedStatement prepareStatementReturnId(final String requestName) throws SQLException {
        checkConnection();
        return con.prepareStatement(requests.getString(requestName), Statement.RETURN_GENERATED_KEYS);
    }
 
    private void checkConnection() throws SQLException {
        if (this.con == null) {
            this.con = getConnection();
        }
    }
 
    private Connection getConnection() throws SQLException {
        DataSource ds;
        try {
            Context initCtx = new InitialContext();
            ds = (DataSource) initCtx.lookup("java:comp/env/jdbc/db");
            return ds.getConnection();
        } catch (NamingException ex) {
            return null;
        }
 
    }
}
En gros, il y a UNE connexion pour toute l'application.

Comment devrais-je procéder pour optimiser tout ça? Une connexion par DAO (en augmentant la taille du pool dans le JNDI et le nombre de connexions max autorisés dans Mysql?). Dois-je plutot faire pour chaque méthode de mes DAOs un DataSource.getConnection et fermer la connexion en fin de méthode? Peut-être existe-t-il un tutorial "bonnes pratiques" à propos de ce que je veux faire?

Merci pour votre aide