Bonjour,
Je gère une application qui va faire des traitements sur plusieurs bases de données.
J'ai une classe DbConnection qui gére la connexion aux bases de données. Je voudrais que cette classe ne m'instancie qu'une connexion pour chaque base.
Je sens que je suis proche du Design Pattern Singleton mais je ne sais pas s'il est vraiment approprié ou si je l'ai mal mis en œuvre. En tous cas la classe que j'ai écrite veut s'occuper à la fois la gestion de l'instanciation unique de chaque connexion et la gestion de la connexion elle-même et je sens bien que ce n'est pas ce qu'il faut faire.
Voici la classe que j'ai écrite :
Je serais tentée de la scinder en deux :
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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127 package com.bdd.util; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.naming.InitialContext; import javax.naming.NamingException; import javax.sql.DataSource; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; public class DbConnection { private static Log log = LogFactory.getLog(DbConnection.class); private String jndiName; private DataSource source; private Connection connexion; private DbConnection[] instances; /** * Constructeur */ private DbConnection(String jndiName) { this.jndiName = jndiName; try { InitialContext ic = new InitialContext(); this.source = (DataSource) ic.lookup(jndiName); this.connexion = source.getConnection(); this.connexion.setAutoCommit(false); log.info(">>> DbConnection :: Connexion à la DataSource '" + this.jndiName + "' <<<"); } catch (NamingException e) { e.printStackTrace(); log.error(">>> DbConnection :: Echec de la connexion à la DataSource '" + this.jndiName + "' <<<" + e.getMessage()); } catch (SQLException e) { e.printStackTrace(); log.error(">>> DbConnection :: Echec de la connexion à la DataSource '" + this.jndiName + "' <<<" + e.getMessage()); } } /** * @param jndiName * Nom JNDI de la DataSource */ public DbConnection getInstance(String jndiName) { if (this.instances[jndiName] == null) { this.instances[jndiName] = new DbConnection(jndiName); } return this.instances[jndiName]; } public ResultSet executeQuery(String query) { log.info(">>> DbConnection.executeQuery :: Execution de la requete : '" + query); ResultSet rs = null; try { Statement st = this.connexion.createStatement(); rs = st.executeQuery(query); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return rs; } public int executeUpdate(String query) { log.info(">>> DbConnection.executeUpdate :: Execution de la requete : '" + query); int updatedRows = 0; try { Statement st = this.connexion.createStatement(); updatedRows = st.executeUpdate(query); log.info(">>> DbConnection.executeUpdate :: Nombre de lignes modifiées : '" + updatedRows); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } return updatedRows; } public void closeResultSet(ResultSet rs) { try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void closeConnection() { try { this.connexion.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void commit() { try { this.connexion.commit(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public void rollback() { try { this.connexion.rollback(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
- Une classe DbConnection pour gérer ma connexion proprement dite,
- Une classe DbConnectionManager qui contiendrait mon tableau de DbConnection et gèrerait l'instanciation unique de chaque connexion.
Le problème est qu'alors je perdrais l'intérêt du fait que le singleton ne peut pas être instancié directement, car je serais alors obligée de rendre mon constructeur public.
Voila où j'en suis de ma réflexion. J'espère avoir été suffisamment claire.
Pouvez-vous me donner votre avis sur la manière de gérer ces connexions ?
Partager