Почему мы используем DataSource вместо DriverManager?

89

Я читаю спецификацию Java JDBC (vr. 4) и привел это утверждение:

DataSource - этот интерфейс был представлен в API необязательного пакета JDBC 2.0. Его предпочтительнее, чем DriverManager, поскольку он позволяет сведениям о базовом источнике данных быть прозрачными для приложения.

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

И создан ли DataSourceинтерфейс только для того, чтобы иметь общий способ возврата подключений, которые можно объединять в пул и т. Д.? В Java EE реализует ли сервер приложений этот интерфейс и развёрнутые приложения, чтобы они имели ссылку на источник данных вместо соединения?

LuckyLuke
источник

Ответы:

72

Лучшая масштабируемость и обслуживание

Для DriverManagerвас нужно знать все детали (хост, порт, имя пользователя, пароль, класс драйвера) для подключения к БД и получить соединение. Вынесение их во внешний вид в файле свойств ничего не меняет в том, что вам нужно знать.

Используя a, DataSourceвам нужно знать только имя JNDI. AppServer заботится о деталях и настраивается не поставщиком клиентского приложения, а администратором того места, где размещено приложение.

Масштабируемость:

Предположим, вам нужно создать соединения самостоятельно, как бы вы справились с изменением нагрузки, когда-то у вас есть 10 пользователей, когда-то у вас есть 1000, вы не можете просто получить соединение всякий раз, когда оно вам нужно, а затем `` отпустить '' его, чтобы сервер базы данных не выйти из соединений, что приведет к объединению в пул соединений. DriverManagerне дает, DataSourceделает.

Если вы собираетесь самостоятельно программировать пул соединений, вам придется использовать DriverManager, в противном случае используйте DataSource.

A4L
источник
4
Внедрение источника данных обеспечивается поставщиком драйвера (скажем, MySQL). Серверу приложений необходимо знать драйвер, чтобы иметь возможность создавать источник данных. После этого он позаботится о привязке его к настроенному имени JNDI (логическому имени). Обратите внимание, что для этого шага настройки должны быть известны все детали (класс драйвера, URL-адрес, имя пользователя, пароль и т. Д.). но это все равно лучше, чем знать их клиентскому приложению.
A4L 04
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 07
9
@CodeChieftain, я думаю, он имеет в виду, если вы хотите реализовать пул соединений самостоятельно, поэтому нечего переворачивать.
Корай Тугай
2
Источник данных обеспечивает опрос соединения. В последнем заявлении говорится, что если вы хотите запрограммировать опрос соединения, перейдите к DataManager. Поначалу это может вводить в заблуждение. Это должно быть, если вы хотите, чтобы в вашем приложении был опрос подключения, для источника данных.
Аникет Такур,
38

DriverManager

  • снижает производительность приложения, поскольку соединения создаются / закрываются в java-классах.
  • не поддерживает пул соединений.

DataSource

  • улучшает производительность приложения, поскольку соединения не создаются / закрываются внутри класса, они управляются сервером приложений и могут быть получены во время выполнения.
  • он предоставляет возможность создания пула подключений
  • полезно для корпоративных приложений
nav0611
источник
Но если бы вы создали свой собственный класс, такой как MyConnectionPool, и проделали в нем некую магию с помощью DriverManager, будет ли это то же самое, что использовать класс, реализующий интерфейс DataSource? Интерфейс DataSource только для того, чтобы иметь общий интерфейс для подключения?
LuckyLuke
1
Не совсем то же самое. Фреймворк, подобный Spring, показывает возможности dataSource и его производительность.
nav0611 04
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если вам нужна одна из этих функций или обе.

Корай Тугай
источник
Проголосуйте. «распределенные транзакции» - это
упущенный
1

Мы можем получить соединение с использованием источника данных следующим образом. Используйте соединение для выполнения любого запроса к базе данных.

DataSource datasource = (DataSource) new InitialContext().lookup(dataSourceName);
Connection connection = datasource.getConnection();
Ансраджу
источник