Gestión de transacciones con Spring y MyBatis: Configuración detallada

Configuración básica

Para la integración inicial, se define un archivo de configuración XML donde se establece el gestor de transacciones junto con los componentes esenciales de MyBatis. Es crucial que la fuente de datos utilizada por el SqlSessionFactory sea la misma que la del DataSourceTransactionManager, de lo contrario, la gestión de transacciones no funcionará.

<!-- Parámetros del pool de conexiones -->
<bean id="parametrosPool" class="com.zaxxer.hikari.HikariConfig">
    <property name="poolName" value="poolSpring" />
    <property name="connectionTestQuery" value="SELECT 1" />
    <property name="dataSourceClassName" value="${jdbc.claseDriver}" />
    <property name="dataSourceProperties">
        <props>
            <prop key="url">${jdbc.enlace}</prop>
            <prop key="user">${jdbc.usuario}</prop>
            <prop key="password">${jdbc.clave}</prop>
            <prop key="cachePrepStmts">true</prop>
            <prop key="prepStmtCacheSize">200</prop>
            <prop key="prepStmtCacheSqlLimit">1024</prop>
        </props>
    </property>
    <property name="autoCommit" value="false"/>
    <property name="readOnly" value="true"/>
    <property name="connectionTimeout" value="15000"/>
    <property name="idleTimeout" value="300000"/>
    <property name="maxLifetime" value="900000 "/>
</bean>
<bean id="fuenteDatos" class="com.zaxxer.hikari.HikariDataSource" destroy-method="close">
    <constructor-arg ref="parametrosPool" />
</bean>

<!-- Definición de la fábrica de sesiones SQL -->
<bean id="fabricaSesionSql" class="org.mybatis.spring.SqlSessionFactoryBean">
    <property name="dataSource" ref="fuenteDatos"/>
    <property name="configLocation" value="classpath:META-INF/mybatis/configuracion.xml"/>
    <property name="mapperLocations" value="classpath:META-INF/mybatis/mappers/*.xml"/>
</bean>

<!-- Escaneo automático de mappers -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
    <property name="annotationClass" value="org.springframework.stereotype.Repository"/>
    <property name="basePackage" value="com.ejemplo.persistencia"/>
</bean>

<!-- Gestor de transacciones y plantilla -->
<bean id="gestorTransacciones" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="fuenteDatos"/>
</bean>
<bean id="plantillaTransaccional" class="org.springframework.transaction.support.TransactionTemplate">
    <property name="transactionManager" ref="gestorTransacciones"/>
    <property name="isolationLevelName" value="ISOLATION_DEFAULT"/>
    <property name="propagationBehaviorName" value="PROPAGATION_REQUIRED"/>
</bean>
<tx:annotation-driven transaction-manager="gestorTransacciones" />

Configuración avanzada con AOP

Para un control granular, se emplean asesoras de transacciones y configuración de AOP, permitiendo definir reglas basadas en patrones de nombres de métodos.

    <tx:method name="obtener*" propagation="SUPPORTS" />
    <tx:method name="buscar*" propagation="SUPPORTS" />
    <tx:method name="cargar*" propagation="SUPPORTS" />
    <tx:method name="consultar*" propagation="SUPPORTS" />
    <tx:method name="listar*" propagation="SUPPORTS" />

    <tx:method name="*" propagation="SUPPORTS" />
</tx:attributes>

</tx:advice> aop:config <aop:pointcut id="corteTransaccional" expression="execution(* com.ejemplo.persistencia..Impl.(..))" /> <aop:advisor pointcut-ref="corteTransaccional" advice-ref="asesoriaTransaccional" /> </aop:config>



</div>Este método permite que las operaciones de escritura se ejecuten en transacciones, mientras que las de lectura funcionan sin ellas, optimizando el rendimiento.

Configuración basada en anotaciones
-----------------------------------

Una alternativa moderna es utilizar anotaciones, donde se declara el gestor de transacciones y se aplica directamente en el código.

<div>

Etiquetas: Spring MyBatis transacciones AOP configuración XML

Publicado el 6-4 20:59