Dlaczego używamy źródła danych zamiast Menedżera Drivermanagera?

Czytam specyfikację Java JDBC (vr. 4)i natknąłem się na to stwierdzenie:

DataSource-interfejs ten został wprowadzony w JDBC 2.0 Opcjonalnie API pakietów. Jest preferowany niż DriverManager, ponieważ pozwala szczegóły dotyczące podstawowego źródła danych, aby były przejrzyste dla zastosowanie

Próbuję zrozumieć, jaka jest różnica między Connection i a DataSource, i dlaczego istnieje. To znaczy, blok powyżej jest napisane, że dane o źródle danych są przejrzyste dla aplikacji, ale czy zewnętrzność 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 DriverManager nie działa w ten sam sposób?

I jest DataSource interfejs stworzony tylko po to, aby mieć wspólny sposób zwracania połączeń, które można łączyć itp.? W Java EE serwer aplikacji implementuje ten interfejs i wdrażane aplikacje mają odniesienie do źródła danych zamiast połączenia?

Author: Basil Bourque, 2013-03-04

5 answers

Lepsza skalowalność i konserwacja

Dla Menedżera sterowników musisz znać wszystkie szczegóły (host, port, nazwę użytkownika, hasło, klasę sterownika), aby połączyć się z DB i uzyskać połączenia. Eksternalizacja tych w pliku właściwości nie zmienia niczego co do tego, że musisz je znać.

Używając źródła danych musisz znać tylko nazwę JNDI. AppServer dba o szczegóły i nie jest konfigurowany przez dostawcę aplikacji klienckiej, ale przez administratora, gdzie aplikacja jest hostowana.

Skalowalność:

Załóżmy, że musisz tworzyć połączenia samodzielnie, jak radzisz sobie ze zmianą obciążenia, czasami masz 10 użytkowników czasami masz 1000, nie możesz po prostu uzyskać połączenia, gdy potrzebujesz jednego, a później go "zwolnić", aby serwer bazy danych nie wydostał się z połączeń, co prowadzi do poolingu połączeń. DriverManager tego nie dostarcza, DataSource to robi.

Jeśli zamierzasz zaprogramować pulę połączeń to musisz użyj DriverManager, w przeciwnym razie idź z DataSource.

 54
Author: A4L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-21 21:11:39

DriverManager.

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

DataSource

  • poprawia wydajność aplikacji, ponieważ połączenia nie są tworzone/zamykane w ramach klasy, są zarządzane przez serwer aplikacji i mogą być pobierane podczas wykonywania.
  • zapewnia obiekt tworzący pulę połączeń
  • pomocny dla aplikacji korporacyjnych
 30
Author: nav0611,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-04 09:43:58

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();
 0
Author: Raju,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-22 04:36:43

Poniższy kod pokazuje dwa sposoby na uzyskanie połączenia.

Nie ma potrzeby wiedzieć o URL w przypadku mySqlDataSource, ponieważ 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));
    }

}

}
 0
Author: Ram Tiwary,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-04-13 15:06:02

Obiekty DataSource mogą zapewniać pooling połączeń i transakcje rozproszone, więc może być konieczne użycie DataSource, jeśli potrzebujesz jednej z tych funkcji lub obu.

 0
Author: Koray Tugay,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-11 17:34:07