Pourquoi utilisons-nous un DataSource au lieu d'un DriverManager?

89

Je lis la spécification Java JDBC (vr.4) et j'ai rencontré cette déclaration:

DataSource - cette interface a été introduite dans l'API de package optionnel JDBC 2.0. Il est préférable à DriverManager car il permet aux détails sur la source de données sous-jacente d'être transparents pour l'application

Ce que j'essaie de comprendre, c'est quelle est la différence entre a Connectionet a DataSource, et pourquoi il existe. Je veux dire, le bloc ci-dessus indique que les détails sur 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 fonctionneraient-elles pas de la même manière?

Et l' DataSourceinterface est-elle créée uniquement pour avoir un moyen commun de renvoyer des connexions qui peuvent être regroupées, etc.? Dans Java EE, le serveur d'applications implémente-t-il cette interface et les applications déployées pour avoir une référence à une source de données au lieu d'une connexion?

Lucky Luke
la source

Réponses:

72

Meilleure évolutivité et maintenance

Car DriverManagervous devez connaître tous les détails (hôte, port, nom d'utilisateur, mot de passe, classe de pilote) pour vous connecter à DB et obtenir des connexions. Les externaliser dans un fichier de propriétés ne change rien au fait que vous devez les connaître.

En utilisant un, il DataSourcevous suffit de connaître 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 où l'application est hébergée.

Évolutivité:

Supposons que vous deviez créer des connexions vous-même, comment feriez-vous face à l'évolution de la charge, parfois vous avez 10 utilisateurs parfois vous en avez 1000, vous ne pouvez pas simplement obtenir une connexion chaque fois que vous en avez besoin et plus tard la `` relâchez '' pour que le serveur de base de données ne le fasse pas sortir des connexions, ce qui vous conduit au regroupement de connexions. DriverManagerne le fournit pas, le DataSourcefait.

Si vous prévoyez de programmer un pool de connexions vous-même, vous devez utiliser DriverManager, sinon allez-y DataSource.

A4L
la source
4
l'implémentation de la source de données est fournie par le fournisseur du pilote (disons MySQL). Le serveur d'applications doit connaître le pilote pour pouvoir créer la source de données. Ensuite, il s'occupe de le lier au nom JNDI (nom logique) qui a été configuré. Notez que pour cette étape de configuration, tous les détails (classe du pilote, url, nom d'utilisateur, mot de passe, etc.) doivent être connus. mais c'est toujours mieux que de les faire connaître par l'application cliente.
A4L
4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- avez-vous inversé les noms?
arun
3
@arun Je ne pense pas, DriverManager est une API de niveau inférieur à DataSource.
A4L
9
@CodeChieftain Je pense qu'il veut dire, si vous voulez implémenter un pool de connexions vous-même, il n'y a donc rien à retourner.
Koray Tugay
2
La source de données fournit une interrogation de connexion. La dernière instruction indique si vous souhaitez programmer l'interrogation de connexion, optez pour DataManager. Cela peut être un peu trompeur au début. Cela devrait être le cas si vous souhaitez avoir une interrogation de connexion dans votre application, recherchez la source de données.
Aniket Thakur
38

DriverManager

  • gêne les performances de l'application car les connexions sont créées / fermées dans les classes java.
  • ne prend pas en charge le regroupement de connexions.

DataSource

  • améliore les performances des applications car les connexions ne sont pas créées / fermées au sein d'une classe, elles sont gérées par le serveur d'applications et peuvent être récupérées lors de l'exécution.
  • il fournit une facilité créant un pool de connexions
  • utile pour les applications d'entreprise
nav0611
la source
Mais si vous avez créé votre propre classe telle que MyConnectionPool et que vous avez fait de la magie à l'intérieur avec DriverManager, serait-ce la même chose que d'utiliser une classe qui implémente l'interface DataSource? L'interface DataSource est-elle uniquement destinée à avoir une interface commune pour obtenir une connexion?
LuckyLuke
1
Pas exactement la même chose: un cadre comme Spring montre la capacité de dataSource et ses performances.
nav0611
3

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

Il n'est pas nécessaire de connaître l'URL si mySqlDataSourcecette 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));
    }

}

}
Ram Tiwary
la source
1

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();
Ansraju
la source
1

DataSourceLes objets peuvent fournir un regroupement de connexions et des transactions distribuées, vous devrez donc peut-être utiliser DataSourcesi vous avez besoin de l'une de ces fonctionnalités ou des deux.

Koray Tugay
la source
Votez. 'transactions distribuées' est un point manquant dans d'autres réponses
卢 声 远 Shengyuan Lu