Warum verwenden wir eine DataSource anstelle eines DriverManager?

89

Ich lese die Java JDBC-Spezifikation (vr. 4) und bin auf diese Aussage gestoßen:

DataSource - Diese Schnittstelle wurde in die optionale JDBC 2.0-Paket-API eingeführt. Es wird gegenüber DriverManager bevorzugt, da Details zur zugrunde liegenden Datenquelle für die Anwendung transparent sind

Ich versuche zu verstehen, was der Unterschied zwischen a Connectionund a DataSourceist und warum er existiert. Ich meine, der obige Block besagt, dass die Details zu einer Datenquelle für die Anwendung transparent sind, aber würden wir Datenbankeigenschaften wie Benutzername, Kennwort, URL usw. nicht in einer Eigenschaftendatei auslagern und dann DriverManager auf die gleiche Weise verwenden?

Und wird die DataSourceSchnittstelle nur erstellt, um eine gemeinsame Methode zum Zurückgeben von Verbindungen zu haben, die gepoolt werden können usw.? Implementiert der Anwendungsserver in Java EE diese Schnittstelle und die bereitgestellten Anwendungen, um anstelle einer Verbindung einen Verweis auf eine Datenquelle zu erhalten?

Lucky Luke
quelle

Antworten:

72

Bessere Skalierbarkeit und Wartung

Für DriverManagerSie alle Details wissen müssen (Host, Port, Benutzername, Passwort, Treiber - Klasse) an der DB zu verbinden und Verbindungen zu erhalten. Das Externalisieren dieser in einer Eigenschaftendatei ändert nichts an der Tatsache, dass Sie sie kennen müssen.

Mit a müssen DataSourceSie nur den JNDI-Namen kennen. Der AppServer kümmert sich um die Details und wird nicht vom Hersteller der Clientanwendung konfiguriert, sondern von einem Administrator, in dem die Anwendung gehostet wird.

Skalierbarkeit:

Angenommen, Sie müssen selbst Verbindungen herstellen. Wie würden Sie mit dem Ändern der Last umgehen? Manchmal haben Sie 10 Benutzer, manchmal haben Sie 1000? Sie können nicht einfach eine Verbindung herstellen, wenn Sie eine benötigen, und diese später freigeben, damit der Datenbankserver dies nicht tut Verlassen Sie die Verbindungen, was Sie zum Verbindungspooling führt. DriverManagerbietet es nicht, DataSourcetut.

Wenn Sie selbst einen Verbindungspool programmieren möchten, müssen Sie diesen verwenden DriverManager, andernfalls gehen Sie mit DataSource.

A4L
quelle
4
Die Datenquellenimplementierung wird vom Treiberhersteller bereitgestellt (sagen wir MySQL). Der Anwendungsserver muss den Treiber kennen, um die Datenquelle erstellen zu können. Danach wird es an den konfigurierten JNDI-Namen (logischer Name) gebunden. Beachten Sie, dass für diesen Konfigurationsschritt alle Details (Treiberklasse, URL, Benutzername, Kennwort usw.) bekannt sein müssen. Dies ist jedoch immer noch besser, als diese der Clientanwendung bekannt zu machen.
A4L
4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- Hast du die Namen umgedreht?
Arun
3
@arun Ich glaube nicht, DriverManager ist eine niedrigere API als DataSource.
A4L
9
@CodeChieftain Ich denke, er meint, wenn Sie einen Verbindungspool selbst implementieren möchten, gibt es nichts zu drehen.
Koray Tugay
1
Sie wissen, dass Sie DataSource nicht mit JNDI verwenden müssen. Wenn Sie möchten, können Sie DriverManager auch mit JNDI verwenden.
Koray Tugay
38

DriverManager

  • beeinträchtigt die Anwendungsleistung, da die Verbindungen in Java-Klassen erstellt / geschlossen werden.
  • unterstützt kein Verbindungspooling.

DataSource

  • Verbessert die Anwendungsleistung, da Verbindungen nicht innerhalb einer Klasse erstellt / geschlossen werden, sondern vom Anwendungsserver verwaltet werden und zur Laufzeit abgerufen werden können.
  • Es bietet eine Funktion zum Erstellen eines Verbindungspools
  • hilfreich für Unternehmensanwendungen
nav0611
quelle
Wenn Sie jedoch eine eigene Klasse wie MyConnectionPool erstellt und mit dem DriverManager etwas Magie darin ausgeführt haben, entspricht dies der Verwendung einer Klasse, die die DataSource-Schnittstelle implementiert? Ist die DataSource-Schnittstelle nur für eine gemeinsame Schnittstelle zum Herstellen einer Verbindung vorgesehen?
LuckyLuke
1
Nicht genau dasselbe. Rahmenwerke wie der Frühling zeigen die Leistungsfähigkeit von dataSource und seine Leistung.
nav0611
3

Der folgende Code zeigt zwei Möglichkeiten zum Herstellen einer Verbindung.

Es ist nicht erforderlich, die URL zu kennen, mySqlDataSourcewenn diese Zeile kommentiert wird.

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
quelle
1

Wir können die Verbindung über eine Datenquelle wie folgt herstellen. Verwenden Sie die Verbindung, um eine Datenbankabfrage durchzuführen.

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

DataSourceObjekte können Verbindungspooling und verteilte Transaktionen bereitstellen. Daher müssen Sie diese möglicherweise verwenden, DataSourcewenn Sie eine oder beide dieser Funktionen benötigen.

Koray Tugay
quelle
Stimmen Sie ab. 'verteilte Transaktionen' ist ein fehlender Punkt in anderen Antworten
gy 声 远 Shengyuan Lu