Por que usamos um DataSource em vez de um DriverManager?

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

DataSource – essa interface foi introduzida na API do Pacote Opcional do 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 uma Connection e uma DataSource e por que ela existe. Quero dizer, o bloco acima diz que os detalhes sobre uma fonte de dados é transparente para o aplicativo, mas não externalizaria as propriedades do database como nome de usuário, senha, url etc em um arquivo de propriedades e usaria o DriverManager da mesma maneira?

E a interface DataSource é criada apenas para ter uma maneira comum de retornar conexões que podem ser agrupadas, etc? No 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?

Melhor escalabilidade e manutenção

Para o gerenciador de driver, você precisa conhecer todos os detalhes (host, porta, nome de usuário, senha, class de driver) para conectar-se ao database 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 DataSource, você só precisa saber o nome da JNDI. O AppServer se preocupa com os detalhes e não é configurado pelo fornecedor do aplicativo cliente, mas por um administrador no qual o aplicativo é hospedado.

Escalabilidade:

Suponha que você precise criar conexões você mesmo, como você lidaria com a mudança de carga, em algum momento você tem 10 usuários em algum momento você tem 1000, você não pode apenas obter uma conexão sempre que precisar de um e depois liberá-lo para que o servidor de database não saia das conexões, o que leva você ao pool de conexões. DriverManager não fornece isso, DataSource faz.

Se você estiver indo para programar um pool de conexão, então você tem que usar DriverManager, caso contrário, vá com DataSource.

DriverManager.

  • dificulta o desempenho do aplicativo, pois as conexões são criadas / fechadas nas classs java.
  • não suporta o pool de conexão.

Fonte de dados

  • melhora o desempenho do aplicativo, pois as conexões não são criadas / fechadas dentro de uma class, elas são gerenciadas pelo servidor de aplicativos e podem ser buscadas durante o tempo de execução.
  • ele fornece uma facilidade criando um pool de conexões
  • útil para aplicativos corporativos

Podemos obter conexão usando uma fonte de dados da seguinte maneira. Use a conexão para executar qualquer consulta de database.

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

Abaixo, o código mostra duas maneiras de obter conexão.

Não há necessidade de saber sobre o URL no caso de mySqlDataSource como esta linha é 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)); } } } 

Os objects DataSource podem fornecer o pool de conexões e as transactions distribuídas, portanto, você pode precisar usar o DataSource se precisar de um ou ambos os resources.

Intereting Posts