L'approche traditionnelle consiste à avoir un objet DAO (Data Access Object) pour chaque classe de données.
I.e. Si vous avez une classe de données "Person", vous avez aussi une classe "PersonDAO" qui implémente des méthodes comme findById(), findAll(), save (Person), etc. La classe DAO gère la totalité de l'interaction DB.
Le constructeur de la classe DAO pouvait simplement accepter un objet Connection et ainsi externaliser le problème de la création de connexions ou il pouvait invoquer une méthode usine quelque part qui distribuait un objet Connection.
Dans les deux cas, vous aurez probablement besoin d'une telle méthode d'usine.
public class Database{
public static Connection getConnection(){
// Create a new connection or use some connection pooling library
}
}
Comme quelqu'un a fait remarquer java.sql.Connection est pas sûre que vous ne devriez pas remettre la même connexion à chaque fois, sauf si vous êtes sûr que plusieurs threads ne seront pas accédaient la méthode.
Bien sûr, si vous devez créer une nouvelle connexion pour chaque appel, vous devrez également fermer les connexions une fois que vous avez terminé. L'approche simple consiste à ajouter une méthode close() aux DAO et à les faire prendre en charge. Cela impose une charge sur le code en utilisant le DAO.
Même si vous utilisez le regroupement de connexions, il est toujours nécessaire de fermer les connexions (retour au pool) une fois que vous avez terminé.
Quelqu'un a suggéré d'utiliser Thread local pour avoir une connexion par thread. Cela fonctionne dans certains cas, mais ne serait pas utile pour une application web où chaque requête est un nouveau thread (qui n'est jamais réutilisé, pourrait aussi bien ne pas stocker une référence). Vous pouvez cependant en profiter dans une application Web si vous l'avez configurée de sorte qu'après avoir traité chaque requête, un appel soit fait à Database.closeConnection() qui prend alors soin de fermer une connexion locale Tread s'il en existe une.
Je dirais qu'il faut éviter cela dans vos cours car c'est une mauvaise habitude à prendre. Il est beaucoup trop facile de laisser tomber un singleton dans "parce que c'est juste coursework/script simple/seulement utilisé ici" – tddmonkey
J'utilise singletons aand monostates dans mon code et l'ai fait pendant les 20 dernières années sans effets secondaires. Ils sont juste un autre outil dans la boîte à outils des concepteurs. –