statement sources getconnection example drivermanager data clase java jdbc datasource

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



statement java (5)

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

DataSource: esta interfaz se introdujo en la API del paquete opcional 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 trato de entender es cuál es la diferencia entre Connection y 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 externalizarían las propiedades de la base de datos como nombre de usuario, contraseña, URL, etc. en un archivo de propiedades y luego usarían DriverManager de la misma manera?

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


DriverManager.

  • dificulta el rendimiento de la aplicación ya que las conexiones se crean / cierran en clases Java.
  • no es compatible con la agrupación de conexiones.

Fuente de datos

  • 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 pueden ser recuperadas durante el tiempo de ejecución.
  • proporciona una instalación que crea un conjunto de conexiones
  • útil para aplicaciones empresariales

El siguiente código muestra dos formas de obtener conexión.

No es necesario conocer la URL en el caso de mySqlDataSource ya que esta línea está 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)); } } }


Los objetos DataSource pueden proporcionar agrupación de conexiones y transacciones distribuidas, por lo que es posible que deba utilizar DataSource si necesita una de estas características o ambas.


Mejor escalabilidad y mantenimiento

Para el administrador de controladores, necesita conocer todos los detalles (host, puerto, nombre de usuario, contraseña, clase de controlador) para conectarse a DB y obtener conexiones. La externalización de aquellos en un archivo de propiedades no cambia nada sobre el hecho de que necesita conocerlos.

Usando un DataSource solo necesitas saber el nombre JNDI. AppServer se preocupa por los detalles y no está configurado por el proveedor de la aplicación cliente, sino por un administrador donde se aloja la aplicación.

Escalabilidad:

Supongamos que necesita crear conexiones usted mismo, cómo trataría con el cambio de carga, alguna vez tiene 10 usuarios alguna vez tiene 1000, no puede simplemente obtener una conexión cada vez que la necesita y luego ''liberarla'' para que el servidor de la base de datos no lo haga salga de las conexiones, lo que lo lleva a la agrupación de conexiones. DriverManager no lo proporciona, DataSource sí lo proporciona.

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


Podemos obtener conexión utilizando un origen de datos de la siguiente manera. Use la conexión para realizar cualquier consulta de base de datos.

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