Dlaczego używamy DataSource zamiast DriverManager?

89

Czytam specyfikację Java JDBC (vr. 4) i napotkałem takie stwierdzenie:

DataSource - ten interfejs został wprowadzony w interfejsie API pakietu opcjonalnego JDBC 2.0. Jest preferowany w stosunku do DriverManager, ponieważ pozwala na przejrzystość szczegółów dotyczących bazowego źródła danych dla aplikacji

Próbuję zrozumieć, jaka jest różnica między a Connectioni a DataSourcei dlaczego istnieje. Chodzi mi o to, że powyższy blok mówi, że szczegóły dotyczące źródła danych są przezroczyste dla aplikacji, ale czy eksternalizacja właściwości bazy danych, takich jak nazwa użytkownika, hasło, adres URL itp. W pliku właściwości, a następnie użycie narzędzia DriverManager, nie działa w ten sam sposób?

Czy DataSourceinterfejs jest tworzony tylko po to, aby mieć wspólny sposób zwracania połączeń, które można łączyć itp.? Czy w Java EE serwer aplikacji implementuje ten interfejs, a aplikacje wdrażane tak, aby miały odniesienie do źródła danych zamiast połączenia?

Lucky Luke
źródło

Odpowiedzi:

72

Lepsza skalowalność i konserwacja

Dla DriverManagertrzeba znać wszystkie szczegóły (host, port, nazwa użytkownika, hasło, klasa kierowca) do połączenia z DB i uzyskać połączenia. Eksternalizacja tych w pliku właściwości nie zmienia niczego w tym, że musisz je znać.

Używając a, DataSourcemusisz tylko znać nazwę JNDI. AppServer dba o szczegóły i nie jest konfigurowany przez dostawcę aplikacji klienckiej, ale przez administratora, na którym aplikacja jest hostowana.

Skalowalność:

Załóżmy, że musisz sam utworzyć połączenia, jak poradzisz sobie ze zmianą obciążenia, czasami masz 10 użytkowników, czasami masz 1000, nie możesz po prostu uzyskać połączenia, kiedy tylko potrzebujesz, a później je `` zwolnić '', aby serwer bazy danych nie działał wyjść z połączeń, co prowadzi do puli połączeń. DriverManagernie zapewnia tego DataSource.

Jeśli zamierzasz samodzielnie zaprogramować pulę połączeń, musisz użyć DriverManager, w przeciwnym razie skorzystaj z DataSource.

A4L
źródło
4
implementacja źródła danych jest dostarczana przez dostawcę sterownika (powiedzmy MySQL). Serwer aplikacji musi znać sterownik, aby móc utworzyć źródło danych. Następnie dba o powiązanie go z nazwą JNDI (nazwą logiczną), która została skonfigurowana. Zauważ, że na tym etapie konfiguracji wszystkie szczegóły (klasa sterownika, adres URL, nazwa użytkownika, hasło itp.) Muszą być znane. ale jest to nadal lepsze niż posiadanie ich w aplikacji klienckiej.
A4L
4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- zamieniłeś imiona?
arun
3
@arun Nie sądzę, DriverManager jest interfejsem API niższego poziomu niż DataSource.
A4L
9
@CodeChieftain Myślę, że ma na myśli, jeśli chcesz samodzielnie wdrożyć pulę połączeń, więc nie ma nic do odwrócenia.
Koray Tugay
2
Źródło danych zapewnia sondowanie połączeń. Ostatnia instrukcja mówi, że jeśli chcesz zaprogramować odpytywanie połączeń, przejdź do DataManager. Na początku może to być nieco mylące. Powinno być, jeśli chcesz mieć sondowanie połączenia w swojej aplikacji, przejdź do źródła danych.
Aniket Thakur,
38

DriverManager

  • utrudnia działanie aplikacji, ponieważ połączenia są tworzone / zamykane w klasach Java.
  • nie obsługuje buforowania połączeń.

DataSource

  • poprawia wydajność aplikacji, ponieważ połączenia nie są tworzone / zamykane w ramach klasy, są zarządzane przez serwer aplikacji i mogą być pobierane w czasie wykonywania.
  • zapewnia możliwość tworzenia puli połączeń
  • przydatne w aplikacjach korporacyjnych
nav0611
źródło
Ale gdybyś utworzył własną klasę, taką jak MyConnectionPool i zrobił w niej trochę magii za pomocą DriverManager, czy byłoby to to samo, co użycie klasy implementującej interfejs DataSource? Czy interfejs DataSource służy tylko do posiadania wspólnego interfejsu do uzyskania połączenia?
LuckyLuke
1
Nie jest to dokładnie to samo. Framework podobnie jak spring pokazuje możliwości DataSource i jego wydajność.
nav0611
3

Poniższy kod przedstawia dwa sposoby uzyskania połączenia.

Nie trzeba znać adresu URL w przypadku, mySqlDataSourcegdy ta linia jest komentowana.

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
źródło
2

DataSourceobiekty mogą zapewniać pule połączeń i transakcje rozproszone, więc może być konieczne użycie DataSourcejednej lub obu tych funkcji.

Koray Tugay
źródło
Głosować. „transakcje rozproszone” to brakujący punkt w innych odpowiedziach
卢 声 远 Shengyuan Lu
1

Możemy uzyskać połączenie za pomocą źródła danych w następujący sposób. Użyj połączenia, aby wykonać dowolne zapytanie do bazy danych.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
ansraju
źródło