Perché usiamo un DataSource invece di un DriverManager?


89

Sto leggendo la specifica Java JDBC (vr.4) e ho riscontrato questa affermazione:

DataSource: questa interfaccia è stata introdotta nell'API del pacchetto facoltativo JDBC 2.0. È preferibile a DriverManager perché consente ai dettagli sull'origine dati sottostante di essere trasparenti per l'applicazione

Quello che sto cercando di capire è qual è la differenza tra a Connectione a DataSource, e perché esiste. Voglio dire, il blocco sopra dice che i dettagli su un'origine dati sono trasparenti per l'applicazione, ma esternalizzare le proprietà del database come nome utente, password, url ecc. In un file di proprietà e quindi utilizzare DriverManager funzionerebbe allo stesso modo?

E l' DataSourceinterfaccia è creata solo per avere un modo comune di restituire connessioni che possono essere raggruppate, ecc.? In Java EE, il server delle applicazioni implementa questa interfaccia e le applicazioni distribuite per avere un riferimento a un'origine dati invece di una connessione?

Risposte:


72

Migliore scalabilità e manutenzione

Perché DriverManagerdevi conoscere tutti i dettagli (host, porta, nome utente, password, classe driver) per connetterti al DB e ottenere connessioni. Esternalizzare quelli in un file delle proprietà non cambia nulla sul fatto che devi conoscerli.

Usando un DataSourcedevi solo conoscere il nome JNDI. L'AppServer si preoccupa dei dettagli e non è configurato dal fornitore dell'applicazione client, ma da un amministratore in cui l'applicazione è ospitata.

Scalabilità:

Supponiamo che tu debba creare connessioni da solo, come gestiresti il ​​cambio di carico, a volte hai 10 utenti a volte hai 1000, non puoi semplicemente ottenere una connessione ogni volta che ne hai bisogno e successivamente 'rilasciarla' in modo che il server database non lo faccia uscire dalle connessioni, il che porta al pool di connessioni. DriverManagernon lo fornisce, lo DataSourcefa.

Se hai intenzione di programmare un pool di connessioni da solo, devi usarlo DriverManager, altrimenti vai con DataSource.


4
l'implementazione dell'origine dati è fornita dal fornitore del driver (diciamo MySQL). Il server app deve conoscere il driver per poter creare l'origine dati. Dopo di che si occupa di collegarlo al nome JNDI (nome logico) che è stato configurato. Notare che per questo passaggio di configurazione tutti i dettagli (classe driver, URL, nome utente, password ecc.) Devono essere noti. ma è comunque meglio che farli conoscere dall'applicazione client.
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- hai capovolto i nomi?
arun

3
@arun Non credo, DriverManager è un'API di livello inferiore rispetto a DataSource.
A4L

9
@CodeChieftain Penso che intenda, se vuoi implementare un pool di connessioni da solo, quindi non c'è nulla da capovolgere.
Koray Tugay

2
L'origine dati fornisce il polling della connessione. L'ultima istruzione afferma che se si desidera programmare il polling della connessione, utilizzare DataManager. All'inizio può essere un po 'fuorviante. Dovrebbe essere se desideri che il polling della connessione nella tua app vada per l'origine dati.
Aniket Thakur

38

DriverManager

  • ostacola le prestazioni dell'applicazione poiché le connessioni vengono create / chiuse nelle classi java.
  • non supporta il pool di connessioni.

DataSource

  • migliora le prestazioni dell'applicazione poiché le connessioni non vengono create / chiuse all'interno di una classe, sono gestite dal server delle applicazioni e possono essere recuperate durante il runtime.
  • fornisce una struttura che crea un pool di connessioni
  • utile per le applicazioni aziendali

Ma se hai creato la tua classe come MyConnectionPool e hai fatto qualche magia al suo interno con DriverManager, sarebbe lo stesso che usare una classe che implementa l'interfaccia DataSource? L'interfaccia DataSource serve solo per avere un'interfaccia comune per ottenere una connessione?
LuckyLuke

1
Non esattamente lo stesso.Framework come la primavera mostra la capacità di dataSource e le sue prestazioni.
nav0611

3

Il codice seguente mostra due modi per ottenere la connessione.

Non è necessario conoscere l'URL nel caso in cui mySqlDataSourcequesta riga sia commentata.

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));
    }

}

}

2

DataSourcegli oggetti possono fornire pool di connessioni e transazioni distribuite, quindi potrebbe essere necessario utilizzarli DataSourcese è necessaria una o entrambe queste funzionalità.


Vota. 'transazioni distribuite' è un punto mancante in altre risposte
卢 声 远 Shengyuan Lu

1

Possiamo ottenere la connessione utilizzando un'origine dati come segue. Utilizzare la connessione per eseguire qualsiasi query sul database.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.