100 votes

Pourquoi utiliser une DataSource au lieu d'un DriverManager ?

Je suis en train de lire la spécification Java JDBC (vr. 4) et je suis tombé sur cette déclaration :

DataSource - cette interface a été introduite dans l'API de paquet optionnelle JDBC 2.0. Package API. Elle est préférée à DriverManager parce qu'elle permet les détails sur la source de données sous-jacente d'être transparents pour l'application application

Ce que j'essaie de comprendre, c'est quelle est la différence entre une Connection et un DataSource et pourquoi il existe. Je veux dire, le bloc ci-dessus dit que les détails d'une source de données sont transparents pour l'application, mais l'externalisation des propriétés de la base de données telles que le nom d'utilisateur, le mot de passe, l'url, etc. dans un fichier de propriétés, puis l'utilisation de DriverManager ne fonctionnerait-elle pas de la même manière ?

Et est-ce que le DataSource créée uniquement pour avoir un moyen commun de renvoyer les connexions qui peuvent être mises en commun, etc. Dans Java EE, le serveur d'application implémente-t-il cette interface et les applications déployées ont-elles une référence à une source de données au lieu d'une connexion ?

77voto

A4L Points 8687

Amélioration de l'évolutivité et de la maintenance

Pour DriverManager vous devez connaître tous les détails (hôte, port, nom d'utilisateur, mot de passe, classe de pilote) pour vous connecter à la base de données et obtenir des connexions. Externaliser ces informations dans un fichier de propriétés ne change rien au fait que vous devez les connaître.

Utilisation d'un DataSource vous n'avez besoin de connaître que le nom JNDI. L'AppServer se soucie des détails et n'est pas configuré par le fournisseur de l'application cliente, mais par un administrateur là où l'application est hébergée.

Évolutivité :

Supposons que vous ayez besoin de créer des connexions vous-même, comment allez-vous gérer les changements de charge, parfois vous avez 10 utilisateurs, parfois vous en avez 1000, vous ne pouvez pas simplement obtenir une connexion quand vous en avez besoin et la "libérer" plus tard pour que le serveur de base de données ne soit pas à court de connexions, ce qui vous conduit à la mise en commun des connexions. DriverManager ne le fournit pas, DataSource fait.

Si vous voulez programmer vous-même un pool de connexion, vous devez utiliser la fonction DriverManager sinon, allez avec DataSource .

42voto

nav0611 Points 770

DriverManager

  • entrave les performances de l'application car les connexions sont créées/fermées dans des classes java.
  • ne prend pas en charge la mise en commun des connexions.

DataSource

  • améliore les performances des applications car les connexions ne sont pas créées/fermées dans une classe, elles sont gérées par le serveur d'application et peuvent être récupérées au moment de l'exécution.
  • il permet de créer un pool de connexions
  • utile pour les applications d'entreprise

3voto

Ram Tiwary Points 39

Le code ci-dessous montre deux façons d'obtenir une connexion.

Il n'est pas nécessaire de connaître l'URL en cas de mySqlDataSource car cette ligne est commentée.

public class MySqlDataSourceTest {

public static void main(String[] args) throws SQLException, ClassNotFoundException {

    /************** using MysqlDataSource starts **************/
    MysqlDataSource d = new MysqlDataSource();
    d.setUser("root");
    d.setPassword("root");
//  d.setUrl("jdbc:mysql://localhost:3306/manavrachna");
    d.setDatabaseName("manavrachna");
    Connection c =  (Connection) d.getConnection();
    /************** using MysqlDataSource ends**************/

    /************** using DriverManager start **************/
    Class.forName("com.mysql.jdbc.Driver");
    Connection c=(Connection) DriverManager.getConnection("jdbc:mysql://localhost:3306/manavrachna","root","root");
    /************** using DriverManager ends **************/

    Statement st=(Statement) c.createStatement();
    ResultSet rs=st.executeQuery("select id from employee");
    while(rs.next())
    {
        System.out.println(rs.getInt(1));
    }

}

}

3voto

Koray Tugay Points 1885

DataSource peuvent fournir une mise en commun des connexions et des transactions distribuées, vous devrez donc peut-être utiliser les objets DataSource si vous avez besoin de l'une de ces fonctions ou des deux.

1voto

Raju Points 115

Nous pouvons obtenir une connexion en utilisant une source de données comme suit. Utilisez la connexion pour effectuer toute requête de base de données.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X