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
:
Establezca un conexión a
DriverManagerDataSource
de la misma manera que normalmente establecería una conexión para JDBC.Especifique el nombre de clase de controlador JDBC completo para que
DriverManager
puede cargar la clase de controlador.Especifique la URL, que varía entre los controladores JDBC. (Consulte la documentación del controlador para conocer el valor correcto).
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:
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("org.hsqldb.jdbcDriver");
dataSource.setUrl("jdbc:hsqldb:hsql://localhost:");
dataSource.setUsername("sa");
dataSource.setPassword("");
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.
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.
GO TO FULL VERSION