¿Por qué utilizamos un DataSource en lugar de un DriverManager?

89

Estoy leyendo la especificación Java JDBC (vr. 4) y encontré esta declaración:

DataSource: esta interfaz se introdujo en la API de paquete opcional de JDBC 2.0. Se prefiere a DriverManager porque permite que los detalles sobre la fuente de datos subyacente sean transparentes para la aplicación.

Lo que estoy tratando de entender es cuál es la diferencia entre ay Connectiona DataSource, y por qué existe. Quiero decir, el bloque anterior dice que los detalles sobre una fuente de datos son transparentes para la aplicación, pero ¿no funcionaría la externalización de las propiedades de la base de datos como el nombre de usuario, la contraseña, la URL, etc.en un archivo de propiedades y luego usar DriverManager de la misma manera?

¿Y la DataSourceinterfaz se crea solo para tener una forma común de devolver conexiones que se pueden agrupar, etc.? En Java EE, ¿el servidor de aplicaciones implementa esta interfaz y las aplicaciones implementadas tienen una referencia a una fuente de datos en lugar de una conexión?

LuckyLuke
fuente

Respuestas:

72

Mejor escalabilidad y mantenimiento

Porque DriverManagernecesita conocer todos los detalles (host, puerto, nombre de usuario, contraseña, clase de controlador) para conectarse a la base de datos y obtener conexiones. Externalizarlos en un archivo de propiedades no cambia nada sobre el hecho de que necesita conocerlos.

Con un DataSourcesolo necesita saber el nombre JNDI. El AppServer se preocupa por los detalles y no lo configura el proveedor de la aplicación cliente, sino un administrador donde está alojada la aplicación.

Escalabilidad:

Suponga que necesita crear conexiones usted mismo, cómo lidiaría con el cambio de carga, en algún momento tiene 10 usuarios en algún momento tiene 1000, no puede simplemente obtener una conexión cada vez que la necesite y luego 'liberarla' para que el servidor de base de datos no lo haga salga de las conexiones, lo que lo lleva a la agrupación de conexiones. DriverManagerno lo proporciona, lo DataSourcehace.

Si va a programar un grupo de conexiones usted mismo, debe usarlo DriverManager; de lo contrario, vaya con DataSource.

A4L
fuente
4
la implementación de la fuente de datos la proporciona el proveedor del controlador (digamos MySQL). El servidor de aplicaciones necesita conocer el controlador para poder crear la fuente de datos. Después de eso, se encarga de vincularlo al nombre JNDI (nombre lógico) que se ha configurado. Tenga en cuenta que para este paso de configuración se deben conocer todos los detalles (clase de controlador, url, nombre de usuario, contraseña, etc.). pero esto es aún mejor que tenerlos conocidos por la aplicación cliente.
A4L
4
If you are going to program a connection pool then you have to use DriverManager, otherwise go with Datasource.- ¿Cambiaste los nombres?
arun
3
@arun No lo creo, DriverManager es una API de menor nivel que DataSource.
A4L
9
@CodeChieftain Creo que quiere decir, si quieres implementar un Connection Pool tú mismo, entonces no hay nada que cambiar.
Koray Tugay
2
La fuente de datos proporciona un sondeo de conexión. La última declaración indica que si desea programar el sondeo de conexión, vaya a DataManager. Puede ser un poco engañoso al principio. Debería serlo si desea tener un sondeo de conexión en su aplicación, elija la fuente de datos.
Aniket Thakur
38

DriverManager

  • obstaculiza el rendimiento de la aplicación ya que las conexiones se crean / cierran en clases java.
  • no admite la agrupación de conexiones.

DataSource

  • mejora el rendimiento de la aplicación, ya que las conexiones no se crean / cierran dentro de una clase, son administradas por el servidor de aplicaciones y se pueden recuperar mientras están en tiempo de ejecución.
  • Proporciona una instalación que crea un conjunto de conexiones.
  • útil para aplicaciones empresariales
nav0611
fuente
Pero si creara su propia clase como MyConnectionPool e hiciera algo de magia dentro de ella con DriverManager, ¿sería lo mismo que usar una clase que implementa la interfaz DataSource? ¿La interfaz de DataSource es solo para tener una interfaz común para obtener una conexión?
LuckyLuke
1
No exactamente lo mismo. Un marco como el resorte muestra la capacidad de dataSource y su rendimiento.
nav0611
3

El siguiente código muestra dos formas de conectarse.

No es necesario conocer la URL en caso de mySqlDataSourceque se comente esta línea.

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
fuente
2

DataSourceLos objetos pueden proporcionar agrupación de conexiones y transacciones distribuidas, por lo que es posible que deba utilizarlas DataSourcesi necesita una de estas funciones o ambas.

Koray Tugay
fuente
Vota arriba. 'transacciones distribuidas' es un punto perdido en otras respuestas
卢 声 远 Shengyuan Lu
1

Podemos conectarnos usando una fuente de datos de la siguiente manera. Utilice la conexión para realizar cualquier consulta a la base de datos.

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