Чому ми використовуємо DataSource замість DriverManager?


89

Я читаю специфікацію Java JDBC (вр. 4), і я врахував це твердження:

DataSource - цей інтерфейс був представлений в API необов’язкового пакету JDBC 2.0. Її надають перевагу над DriverManager, оскільки вона дозволяє прозорі для програми відомості про базове джерело даних

Я намагаюся зрозуміти, в чому полягає різниця між а Connectionі а DataSource, і чому вона існує. Я маю на увазі, що у наведеному вище блоці сказано, що деталі про джерело даних прозорі для програми, але чи не буде екстерналізація властивостей бази даних, таких як ім’я користувача, пароль, URL-адреса тощо у файлі властивостей, а потім використовувати роботу DriverManager таким же чином?

І чи DataSourceстворений інтерфейс лише для того, щоб мати загальний спосіб повернення з'єднань, які можна об'єднати і т.д.? Чи реалізує в Java EE сервер програм цей інтерфейс та розгорнуті програми, щоб мати посилання на джерело даних замість з'єднання?

Відповіді:


72

Краща масштабованість та технічне обслуговування

Для DriverManager вас потрібно знати всі деталі (хост, порт, ім'я користувача, пароль, клас драйвера) для підключення до БД і отримати з'єднання. Екстерналізація файлів у файлі властивостей нічого не змінює щодо того, що вам потрібно їх знати.

Використовуючи a, DataSourceвам потрібно знати лише ім'я JNDI. AppServer дбає про деталі і не налаштовується постачальником постачальника клієнтської програми, а адміністратором, де розміщується додаток.

Масштабованість:

Припустимо, вам потрібно створити підключення самостійно, як би ви мали справу зі зміною навантаження, колись у вас 10 користувачів, колись у вас 1000, ви не можете просто отримати підключення, коли вам це потрібно, а пізніше `` звільнити '' його, щоб сервер баз даних не вийти зі зв’язків, що призводить до об’єднання об’єднань. DriverManagerне забезпечує, DataSourceробить.

Якщо ви збираєтеся запрограмувати пул з'єднань самостійно, тоді вам доведеться скористатися DriverManager, в іншому випадку піти з DataSource.


4
імплементація джерела даних забезпечується постачальником драйверів (припустимо, MySQL). Сервер програм повинен знати драйвер, щоб мати можливість створити Джерело даних. Після цього він подбає про прив’язку його до імені JNDI (логічне ім’я), яке було налаштовано. Зверніть увагу, що для цього кроку конфігурації повинні бути відомі всі деталі (клас драйвера, URL-адреса, ім’я користувача, пароль тощо). але це все-таки краще, ніж їх відомі клієнтській програмі.
A4L

4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- ти перегорнув імена?
arun

3
@arun Я не думаю, що DriverManager - API нижчого рівня, ніж DataSource.
A4L

9
@CodeChieftain Я думаю, він має на увазі, якщо ви хочете самостійно реалізувати пул підключень, тож нема чого перевертати.
Koray Tugay

2
Джерело даних забезпечує опитування з'єднання. Останнє твердження вказує, якщо ви хочете запрограмувати опитування з'єднання, перейдіть для DataManager. Спочатку це може трохи ввести в оману. Це повинно бути, якщо ви хочете, щоб опитування з’єднання у вашому додатку перейшло на джерело даних.
Aniket Thakur

38

DriverManager

  • обмежує продуктивність програми, оскільки з'єднання створюються / закриваються в класах Java.
  • не підтримує пул з'єднань.

DataSource

  • покращує продуктивність програми, оскільки зв’язки не створюються / не закриваються в класі, ними керує сервер додатків і їх можна отримати під час виконання.
  • він забезпечує можливість створення пулу зв'язків
  • корисний для корпоративних програм

Але якщо ви створили свій власний клас, такий як MyConnectionPool, і зробили в ньому магію за допомогою DriverManager, чи не буде це те саме, що використовувати клас, який реалізує інтерфейс DataSource? Чи є інтерфейс DataSource лише для того, щоб мати спільний інтерфейс для встановлення з'єднання?
LuckyLuke

1
Не зовсім однаково. Такі рамки, як spring, показують можливості dataSource та його продуктивність.
nav0611 04.03.13

3

Нижче код показує два способи встановлення з'єднання.

Немає необхідності знати про URL у випадку, mySqlDataSourceколи цей рядок коментується.

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

DataSourceоб'єкти можуть забезпечувати пул з'єднань та розподілені транзакції, тому вам, можливо, доведеться використовувати, DataSourceякщо вам потрібна одна з цих функцій або обидві.


Голосуйте `` розподілені транзакції '' відсутня точка в інших відповідях
卢 声 远 Shengyuan Lu

1

Ми можемо отримати зв’язок за допомогою джерела даних наступним чином. Використовуйте підключення для виконання будь-якого запиту до бази даних.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.