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.