Por que usamos um DataSource em vez de um DriverManager?

89

Estou lendo a especificação Java JDBC (vr. 4) e encontrei esta declaração:

DataSource - esta interface foi introduzida na API de pacote opcional JDBC 2.0. É preferível ao DriverManager porque permite que os detalhes sobre a fonte de dados subjacente sejam transparentes para o aplicativo

O que estou tentando entender é qual é a diferença entre a Connectione a DataSource, e por que existe. Quer dizer, o bloco acima diz que os detalhes sobre uma fonte de dados são transparentes para o aplicativo, mas externalizar as propriedades do banco de dados como nome de usuário, senha, url etc em um arquivo de propriedade e usar o DriverManager não funcionaria da mesma maneira?

E a DataSourceinterface é criada apenas para ter uma maneira comum de retornar conexões que podem ser agrupadas etc.? Em Java EE, o servidor de aplicativos implementa essa interface e os aplicativos implantados para ter uma referência a uma fonte de dados em vez de uma conexão?

LuckyLuke
fonte

Respostas:

72

Melhor escalabilidade e manutenção

Pois DriverManagervocê precisa saber todos os detalhes (host, porta, nome de usuário, senha, classe do driver) para se conectar ao banco de dados e obter conexões. Externalizar aqueles em um arquivo de propriedades não muda nada sobre o fato de que você precisa conhecê-los.

Usando um, DataSourcevocê só precisa saber o nome JNDI. O AppServer se preocupa com os detalhes e não é configurado pelo fornecedor do aplicativo cliente, mas por um administrador onde o aplicativo está hospedado.

Escalabilidade:

Suponha que você mesmo precise criar conexões, como você lidaria com a mudança de carga, às vezes você tem 10 usuários às vezes você tem 1000, você não pode simplesmente obter uma conexão sempre que precisar e depois 'liberá-la' para que o servidor de banco de dados não sair de conexões, o que leva você ao pool de conexão. DriverManagernão fornece, DataSourcefornece.

Se você for programar um pool de conexão sozinho, precisará usá-lo DriverManager; caso contrário, continue DataSource.

A4L
fonte
4
a implementação da fonte de dados é fornecida pelo fornecedor do driver (digamos, MySQL). O appserver precisa conhecer o driver para poder criar a fonte de dados. Depois disso, ele se encarrega de vinculá-lo ao nome JNDI (nome lógico) que foi configurado. Observe que para esta etapa de configuração, todos os detalhes (classe do driver, url, nome de usuário, senha etc.) devem ser conhecidos. mas isso ainda é melhor do que tê-los conhecidos pelo aplicativo cliente.
A4L
4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- você mudou os nomes?
arun
3
@arun Acho que não, DriverManager é uma API de nível inferior do que DataSource.
A4L
9
@CodeChieftain Acho que ele quer dizer se você deseja implementar um Connection Pool sozinho, então não há nada para virar.
Koray Tugay
2
A fonte de dados fornece pesquisa de conexão. A última instrução afirma se você deseja programar a pesquisa de conexão, vá para DataManager. Pode ser um pouco enganador no início. Deveria ser se você deseja que a pesquisa de conexão em seu aplicativo vá para a fonte de dados.
Aniket Thakur
38

DriverManager

  • dificulta o desempenho do aplicativo, pois as conexões são criadas / fechadas em classes java.
  • não oferece suporte ao pool de conexão.

DataSource

  • melhora o desempenho do aplicativo, pois as conexões não são criadas / fechadas dentro de uma classe, são gerenciadas pelo servidor de aplicativos e podem ser buscadas durante a execução.
  • fornece uma facilidade de criação de um pool de conexões
  • útil para aplicativos empresariais
nav0611
fonte
Mas se você criasse sua própria classe como MyConnectionPool e fizesse alguma mágica dentro dela com o DriverManager, isso seria o mesmo que usar uma classe que implementa a interface DataSource? A interface DataSource serve apenas para ter uma interface comum para conseguir uma conexão?
LuckyLuke
1
Não exatamente o mesmo. O framework como o spring mostra a capacidade do dataSource e seu desempenho.
nav0611
3

O código abaixo mostra duas maneiras de obter conexão.

Não há necessidade de saber sobre o URL caso mySqlDataSourceesta linha seja comentada.

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

Podemos obter a conexão usando uma fonte de dados da seguinte maneira. Use a conexão para realizar qualquer consulta ao banco de dados.

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

DataSourceos objetos podem fornecer pool de conexão e transações distribuídas, portanto, pode ser necessário usar DataSourcese precisar de um ou de ambos os recursos.

Koray Tugay
fonte
Vote. 'transações distribuídas' é um ponto que falta em outras respostas
卢 声 远 Shengyuan Lu