web-dev-qa-db-fra.com

Une connexion DB devrait-elle être un singleton?

Quelle est la meilleure façon de créer Java pour créer un singleton? Si une connexion DB est un singleton (être un singleton, il est automatiquement thread-coffre-fort)? Parce que la DB ne peut pas être accessible par de nombreux les utilisateurs dans le même temps.

19
spauny

Une connexion DB ne doit normalement pas être un singleton.

Deux raisons:

  1. de nombreux pilotes de DB ne sont pas en sécurité. L'utilisation d'un singleton signifie que si vous avez de nombreux threads, ils partagent tous la même connexion. Le motif singleton ne vous donne pas de fil Saftey. Il permet simplement de nombreux threads de partager facilement une instance "globale".
  2. Personnellement, je pense que Singleton mène souvent à un mauvais design: voir cet article (par quelqu'un d'autre) http://tech.pedanger.com/2007/07/03/pattern-hate-singleton/

Au lieu de cela, considérez un pool de base de données. La piscine est partagée (et pourrait être un singleton si vous le souhaitez). Lorsque vous devez faire de la base de données, votre code fait ceci:

getConnectioFromPool();

doWork()
closeConnection() // releases back to pool

Exemples de bibliothèques de piscine:

27
Dave

Le meilleur La façon de créer un singleton (à compter d'aujourd'hui) est le modèle Enum Singleton ( Java Enum singleton )

Je doute qu'un singleton est nécessaire ou de toute valeur pour une connexion de base de données. Vous voulez probablement une création paresseuse: une connexion est créée sur la première demande et la mise en cache, d'autres demandes seront remplies avec l'instance mise en cache:

public ConnectionProvider {
  private Connection conn;

  public static Connection getConnection() {
    if (conn == null || conn.isClosed()) {
      conn = magicallyCreateNewConnection();
    }
    return conn;
  }
}

(Pas de fil de sécurité - Synchroniser, si nécessaire)

4
Andreas_D

Quelle est la meilleure façon Java pour créer un singleton?

Suivez les directives de création de modèle de conception. i.e. constructeur privé, etc.

Une connexion DB doit être un singleton (étant un singleton c'est thread-safe automatiquement)?

la création d'une connexion DB en tant que singleton pourrait être un choix de conception médiocre dans de nombreux scénarios. Utilisez-le seulement si vous êtes sûr que vous n'avez pas besoin DB concurrency. Si vous avez plusieurs utilisateurs connectés en même temps, ou même si votre fraie utilisateur unique de nombreux threads qui ont besoin d'accéder à la base de données, puis un DB pool de connexion est un meilleur choix. Vous pouvez utiliser Apache ou les pools de connexion de Tomcat. Ces classes sont définies par exemple dans le paquet

org.Apache.commons.dbcp.*;

org.Apache.Tomcat.dbcp.dbcp.*;

où DBCP est synonyme de mise en commun de connexion de base de données.

La principale raison de l'utilisation d'un pool de connexion est que, en moyenne, le temps nécessaire pour l'accès DB (DML etc) est beaucoup plus petit que le temps qu'il faut pour créer une connexion, puis fermer la connexion. En outre, ne pas oublier de fermer vos ResultSet, les variables PreparedStatement et connexion une fois la transaction effectuée.

Parce que théorique la DB ne peut être consulté par de nombreux utilisateurs dans le même temps.

Pourquoi pas? DB dans la plupart des cas est destiné à être utilisé en même temps. Vous avez ces niveaux d'isolation de DB - READ_COMMITTED, READ_UNCOMMITTED, etc. NUMERO DE SERIE est le cas NUMERO DE SERIE où votre DB devient un accès utilisateur unique.

3
Basanth Roy

Les singletons sont un modèle - il n'y a pas de moyen explicite de en créer une, vous suivez simplement la pratique de la conception.

Donc, si vous utilisez une base de données capable de gérer des lectures/écritures simultanées (c'est-à-dire mysql), vous n'avez pas besoin de vous inquiéter de la sécurité du thread. Si vous utilisez un dB qui ne fait pas que la simultanée écrit bien (SQLite), un singleton devrait théoriquement fonctionner.

2
jefflunt