Usando DataSource

Spring obtiene una conexión de base de datos a través de DataSource. DataSource es parte de la especificación JDBC y es una fábrica de conexiones genérica. Permite que el contenedor o marco oculte los problemas de agrupación de conexiones y gestión de transacciones del código de la aplicación. Como desarrollador, no necesita saber en detalle cómo conectarse a una base de datos. Esta es responsabilidad del administrador que configura la fuente de datos. Es probable que desempeñes ambos roles a medida que desarrollas y pruebas el código, pero no necesariamente necesitas saber cómo está configurada la fuente de datos de producción.

Si estás usando la capa JDBC en Spring, puedes obtener la fuente de datos de JNDI o configurar la suya propia utilizando una implementación de grupo de conexiones proporcionada por un tercero. Las opciones tradicionales son Apache Commons DBCP y C3P0 con clases DataSource basadas en beans; para un grupo de conexiones JDBC moderno, considere HikariCP con su API basada en diseñador.

DriverManagerDataSource y SimpleDriverDataSource ¡Las clases (incluidas en la distribución Spring) deben usarse solo con fines de prueba! Estas opciones no proporcionan agrupación y no funcionan bien cuando hay múltiples solicitudes de conexión.

La siguiente sección utiliza la implementación DriverManagerDataSource de Spring. Varias otras opciones de DataSource se analizarán más adelante.

Para configurar DriverManagerDataSource:

  1. Establezca un conexión a DriverManagerDataSource de la misma manera que normalmente establecería una conexión para JDBC.

  2. Especifique el nombre de clase de controlador JDBC completo para que DriverManager puede cargar la clase de controlador.

  3. Especifique la URL, que varía entre los controladores JDBC. (Consulte la documentación del controlador para conocer el valor correcto).

  4. Especifique el nombre de usuario y la contraseña para conectarse a la base de datos.

El siguiente ejemplo muestra cómo configurar DriverManagerDataSource en Java:

Java
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
Java
val dataSource = DriverManagerDataSource().apply {
    setDriverClassName("org.hsqldb.jdbcDriver")
    url = "jdbc:hsqldb:hsql://localhost:"
    username = "sa"
    password = ""
}

El siguiente ejemplo muestra la configuración XML correspondiente:

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>

Los siguientes dos ejemplos muestran la conexión y configuración básica para DBCP y C3P0. Para conocer otras opciones que le ayudarán a administrar la funcionalidad de agrupación, consulte la documentación del producto para su respectiva implementación de agrupación de conexiones.

El siguiente ejemplo muestra una configuración DBCP:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>

El siguiente ejemplo muestra la configuración de C3P0:

<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
    <property name="driverClass" value="${jdbc.driverClassName}"/>
    <property name="jdbcUrl" value="${jdbc.url}"/>
    <property name="user" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
</bean>
<context:property-placeholder location="jdbc.properties"/>

Uso de DataSourceUtils

La clase DataSourceUtils es una clase auxiliar conveniente y con todas las funciones que proporciona métodos estáticos para establecer conexiones desde JNDI y cerrar conexiones cuando sea necesario. Admite conexiones de streaming, por ejemplo, con DataSourceTransactionManager.

La implementación de SmartDataSource

El SmartDataSource la interfaz debe implementarse mediante clases que puedan proporcionar una conexión a una base de datos relacional. Extiende la interfaz DataSource para permitir que las clases que la usan realicen una solicitud sobre si la conexión debe cerrarse después de una determinada operación. Este uso es efectivo si sabe que necesita reutilizar la conexión.

La extensión AbstractDataSource

AbstractDataSource es Clase base abstracta para implementaciones DataSource de Spring. Implementa código que es común a todas las implementaciones de DataSource. Debes extender la clase AbstractDataSource si escribes tu propia implementación de DataSource.

Uso de SingleConnectionDataSource

La clase SingleConnectionDataSource es una implementación de la interfaz SmartDataSource que envuelve un único Connection, que no se cierra después de cada uso. No admite subprocesos múltiples.

Si algún código de cliente llama a close bajo el supuesto de que existe un grupo de conexiones (como cuando se utilizan herramientas de soporte de persistencia), debe establecer la propiedad suppressClose a true . Este parámetro devuelve un proxy que suprime los cierres que envuelven la conexión física. Tenga en cuenta que ya no puede convertirlo al Connection de Oracle ni a un objeto similar.

SingleConnectionDataSource es principalmente una clase de prueba. Generalmente le permite probar fácilmente su código fuera del servidor de aplicaciones cuando se combina con un entorno JNDI simple. A diferencia de DriverManagerDataSource, utiliza constantemente la misma conexión, evitando la creación excesiva de conexiones físicas.

Uso de DriverManagerDataSource

El La clase DriverManagerDataSource es una implementación de la interfaz estándar DataSource que configura un controlador JDBC normal a través de propiedades de bean y devuelve una nueva Connection cada vez.

Esta implementación es útil para entornos de prueba e independientes fuera de un contenedor Java EE, ya sea como un bean DataSource en un contenedor Spring IoC o en combinación con un entorno JNDI simple. Las llamadas a Connection.close() cierran la conexión, por lo que cualquier código de persistencia que sea compatible con DataSource debería funcionar. Sin embargo, usar grupos de conexiones basados en JavaBean (como commons-dbcp) es tan fácil, incluso en un entorno de prueba, que casi siempre es preferible a DriverManagerDataSource.

Usar TransactionAwareDataSourceProxy

TransactionAwareDataSourceProxy es un proxy para el DataSource de destino. El proxy envuelve el DataSource de destino para mejorar la compatibilidad con las transacciones administradas por Spring. En este sentido, es similar al DataSource transaccional JNDI proporcionado por el servidor Java EE.

Usar esta clase es no es particularmente deseable, a menos que necesite llamar al código existente y pasarle una implementación estándar de la interfaz DataSource de JDBC. En este caso, puede conservar la capacidad de utilizar este código y, al mismo tiempo, asegurarse de que este código participe en las transacciones administradas por Spring. Generalmente es preferible escribir su propio código nuevo utilizando abstracciones de nivel superior para administrar recursos, como JdbcTemplate o DataSourceUtils.

Ver más información javadoc por TransactionAwareDataSourceProxy .

Uso de DataSourceTransactionManager

La clase DataSourceTransactionManager es una implementación de PlatformTransactionManager para fuentes de datos JDBC individuales. Vincula una conexión JDBC desde la fuente de datos especificada al hilo que se está ejecutando actualmente, permitiendo potencialmente una conexión de hilo por fuente de datos.

El código de la aplicación debe obtener la conexión JDBC a través de DataSourceUtils.getConnection(DataSource) en lugar del DataSource.getConnection estándar en Java EE. Lanza excepciones org.springframework.dao no marcadas en lugar de SQLExceptions marcadas. Todas las clases de marco (por ejemplo, JdbcTemplate) utilizan esta estrategia implícitamente. Si la estrategia de búsqueda no se utiliza con este administrador de transacciones, se comporta exactamente igual que uno normal. Por lo tanto, se puede utilizar en cualquier caso.

La clase DataSourceTransactionManager admite niveles de aislamiento personalizados y valores de tiempo de espera, que se aplican como valores de tiempo de espera correspondientes para las solicitudes de declaraciones JDBC. Para admitir esta última opción, el código de la aplicación debe usar JdbcTemplate o llamar al método DataSourceUtils.applyTransactionTimeout(..) para cada declaración generada.

Usted Puede usar esta implementación en lugar de JtaTransactionManager cuando usa un único recurso, ya que no requiere que el contenedor admita JTA. Cambiar entre ellos es simplemente una cuestión de configuración, siempre y cuando cumpla con el patrón de búsqueda de conexión requerido. JTA no admite niveles de aislamiento creados personalizados.