web-dev-qa-db-fra.com

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

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

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

Ce que j'essaie de comprendre, c'est quelle est la différence entre un Connection et un DataSource , et pourquoi cela existe. Je veux dire, le bloc ci-dessus indique que les détails concernant 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 de la même manière

Et l'interface DataSource est-elle créée uniquement pour permettre de renvoyer les connexions pouvant être mises en pool, etc.? Dans Java EE, le serveur d'applications 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?

73
LuckyLuke

Meilleure évolutivité et maintenance

Pour le gestionnaire de pilotes, 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 ceux-ci dans un fichier de propriétés ne change rien au fait que vous ayez besoin de les connaître.

En utilisant une source de données, il vous suffit de connaître le nom JNDI. Le serveur d'applications se soucie des détails et n'est pas configuré par le fournisseur de l'application client, mais par un administrateur où l'application est hébergée.

Evolutivité:

Supposons que vous deviez créer des connexions vous-même. Comment gérer la charge, si vous avez 10 utilisateurs et que vous en avez 1 000, vous ne pouvez pas obtenir une connexion chaque fois que vous en avez besoin et la «relâcher» plus tard, le serveur de base de données ne sortir des connexions, ce qui vous conduit au pooling de connexion. DriverManager ne le fournit pas, DataSource en fournit.

Si vous envisagez de programmer un pool de connexions, vous devez utiliser DriverManager, sinon utilisez DataSource.

58
A4L

DriverManager.

  • entrave les performances de l'application lorsque les connexions sont créées/fermées dans des classes Java.
  • ne prend pas en charge le regroupement de connexions.

La source de données

  • améliore les performances de l'application 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 extraites au moment de l'exécution.
  • il fournit une installation créant un pool de connexions
  • utile pour les applications d'entreprise 
33
nav0611

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

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

}

}
3
Ram Tiwary

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

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

Les objets DataSource peuvent fournir un regroupement de connexions et des transactions distribuées. Il est donc possible que vous deviez utiliser DataSource si vous avez besoin de l'une de ces fonctionnalités ou des deux.

0
Koray Tugay