Java-Spring⽀持的事务管理类型有哪些?你在项⽬中使⽤哪
种⽅式?
Spring⽀持编程式事务管理和声明式事务管理。许多Spring框架的⽤户选择声明式事务管理,因为这种⽅式和应⽤程序的关联较少,因此更加符合轻量级容器的概念。声明式事务管理要优于编程式事务管理,尽管在灵活性⽅⾯它弱于编程式事务管理,因为编程式事务允许你通过代码控制业务。
事务分为全局事务和局部事务。全局事务由应⽤服务器管理,需要底层服务器JTA⽀持(如WebLogic、WildFly等)。局部事务和底层采⽤的持久化⽅案有关,例如使⽤JDBC进⾏持久化时,需要使⽤Connetion对象来操作事务;⽽采⽤Hibernate进⾏持久化时,需要使⽤Session对象来操作事务。
Spring提供了如下所⽰的事务管理器。
事务管理器实现类⽬标对象
DataSourceTransactionManager注⼊DataSource
HibernateTransactionManager注⼊SessionFactory
JdoTransactionManager管理JDO事务
JtaTransactionManager使⽤JTA管理事务
PersistenceBrokerTransactionManager管理Apache的OJB事务
这些事务的⽗接⼝都是PlatformTransactionManager。Spring的事务管理机制是⼀种典型的策略模式,PlatformTransactionManager 代表事务管理接⼝,该接⼝定义了三个⽅法,该接⼝并不知道底层如何管理事务,但是它的实现类必须提供getTransaction()⽅法(开启事务)、commit()⽅法(提交事务)、rollback()⽅法(回滚事务)的多态实现,这样就可以⽤不同的实现类代表不同的事务管理策略。使⽤JTA全局事务策略时,需要底层应⽤服务器⽀持,⽽不同的应⽤服务器所提供的JTA全局事务可能存在细节上的差异,因此实际配置全局事务管理器是可能需要使⽤JtaTransactionManager的⼦类,如:WebLogicJtaTransactionManager(Oracle的WebLogic服务器提供)、UowJtaTransactionManager(IBM的WebSphere服务器提供)等。
编程式事务管理如下所⽰。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance" xmlns:p="
g/schema/p"
xmlns:p="/schema/context"
xsi:schemaLocation="/schema/beans /schema/beans/spring-beans.xsd /schema/context /schema/context/spring-context.xsd">
<context:component-scan base-package="com.jackfrued"/>
<bean id="propertyConfig"
class="org.springframework.fig.
PropertyPlaceholderConfigurer">
<property name="location">
<value>jdbc.properties</value>
</property>
</bean>
<bean id="dataSource" class="org.apachemons.dbcp.BasicDataSource">
<property name="driverClassName">
<value>${db.driver}</value>
</property>
<property name="url">
<value>${db.url}</value>
</property>
<property name="username">
<value>${db.username}</value>
</property>
<property name="password">
<value>${db.password}</value>
</property>
</bean>
<bean id="jdbcTemplate" class="org.JdbcTemplate">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- JDBC事务管理器 -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.
DataSourceTransactionManager" scope="singleton">
<property name="dataSource">
<ref bean="dataSource" />
</property>
</bean>
<!-- 声明事务模板 -->
<bean id="transactionTemplate"
class="ansaction.support.
TransactionTemplate">
<property name="transactionManager">
<ref bean="transactionManager" />
</property>
</bean>
</beans>
package chimomo.de.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.JdbcTemplate;
import chimomo.de.spring.EmpDao;
import chimomo.de.spring.Emp;
@Repository
public class EmpDaoImpl implements EmpDao {
@Autowired
private JdbcTemplate jdbcTemplate;
@Override
public boolean save(Emp emp) {
String sql = "insert into emp values (?,?,?)";
return jdbcTemplate.update(sql, Id(), Name(), Birthday()) == 1;
}
}
package chimomo.de.spring;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import ansaction.TransactionStatus;
import ansaction.support.TransactionCallbackWithoutResult;
import ansaction.support.TransactionTemplate;
import chimomo.de.spring.EmpService;
import chimomo.de.spring.EmpDao;
weblogic管理页面import chimomo.de.spring.Emp;
@Service
public class EmpServiceImpl implements EmpService {
@Autowired
private TransactionTemplate txTemplate;
@Autowired
private EmpDao empDao;
@Override
public void addEmp(final Emp emp) {
@Override
protected void doInTransactionWithoutResult(TransactionStatus txStatus) {
empDao.save(emp);
}
});
}
}
声明式事务如下所⽰,以Spring整合Hibernate 3为例,包括完整的DAO和业务逻辑代码。
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="/schema/beans"
xmlns:xsi="/2001/XMLSchema-instance"
xmlns:p="/schema/p"
xmlns:context="/schema/context"
xmlns:aop="/schema/aop"
xmlns:tx="/schema/tx"
xmlns:tx="/schema/tx"
xsi:schemaLocation="/schema/beans
/schema/beans/spring-beans-3.2.xsd
/schema/context
/schema/context/spring-context-3.2.xsd
/schema/aop
/schema/aop/spring-aop-3.2.xsd
/schema/tx
/schema/tx/spring-tx-3.2.xsd">
<!-- 配置由Spring IoC容器托管的对象对应的被注解的类所在的包 -->
<context:component-scan base-package="com.jackfrued" />
<!-- 配置通过⾃动⽣成代理实现AOP功能 -->
<aop:aspectj-autoproxy />
<!-- 配置数据库连接池 (DBCP) -->
<bean id="dataSource" class="org.apachemons.dbcp.BasicDataSource"
destroy-method="close">
<!-- 配置驱动程序类 -->
<property name="driverClassName" value="sql.jdbc.Driver" />
<!-- 配置连接数据库的URL -->
<property name="url" value="jdbc:mysql://localhost:3306/myweb" />
<!-- 配置访问数据库的⽤户名 -->
<property name="username" value="root" />
<!-- 配置访问数据库的⼝令 -->
<property name="password" value="123456" />
<!-- 配置最⼤连接数 -->
<property name="maxActive" value="150" />
<!-- 配置最⼩空闲连接数 -->
<property name="minIdle" value="5" />
<!-- 配置最⼤空闲连接数 -->
<property name="maxIdle" value="20" />
<!-- 配置初始连接数 -->
<property name="initialSize" value="10" />
<!-- 配置连接被泄露时是否⽣成⽇志 -->
<property name="logAbandoned" value="true" />
<!-- 配置是否删除超时连接 -->
<property name="removeAbandoned" value="true" />
<!-- 配置删除超时连接的超时门限值(以秒为单位) -->
<property name="removeAbandonedTimeout" value="120" />
<!-- 配置超时等待时间(以毫秒为单位) -->
<property name="maxWait" value="5000" />
<!-- 配置空闲连接回收器线程运⾏的时间间隔(以毫秒为单位) -->
<property name="timeBetweenEvictionRunsMillis" value="300000" />
<!-- 配置连接空闲多长时间后(以毫秒为单位)被断开连接 -->
<property name="minEvictableIdleTimeMillis" value="60000" />
</bean>
<!-- 配置Spring提供的⽀持注解ORM映射的Hibernate会话⼯⼚ -->
<bean id="sessionFactory"
class="hibernate3.annotation.AnnotationSessionFactoryBean"> <!-- 通过setter注⼊数据源属性 -->
<property name="dataSource" ref="dataSource" />
<!-- 配置实体类所在的包 -->
<property name="packagesToScan" value="ity" />
<!-- 配置Hibernate的相关属性 -->
<property name="hibernateProperties">
<!-- 在项⽬调试完成后要删除show_sql和format_sql属性否则对性能有显著影响 -->
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
</value>
</property>
</bean>
<!-- 配置Spring提供的Hibernate事务管理器 -->
<!-- 配置Spring提供的Hibernate事务管理器 -->
<bean id="transactionManager"
class="hibernate3.HibernateTransactionManager"> <!-- 通过setter注⼊Hibernate会话⼯⼚ -->
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<!-- 配置基于注解配置声明式事务 -->
<tx:annotation-driven />
</beans>
package chimomo.de.spring;
import java.io.Serializable;
import java.util.List;
import chimomo.de.spring.QueryBean;
import chimomo.de.spring.QueryResult;
/**
* 数据访问对象接⼝(以对象为单位封装CRUD操作)
*
* @param <E> 实体类型
* @param <K> 实体标识字段的类型
*/
public interface BaseDao <E, K extends Serializable> {
/**
* 新增
* @param entity 业务实体对象
* @return 增加成功返回实体对象的标识
*/
public K save(E entity);
/**
* 删除
* @param entity 业务实体对象
*/
public void delete(E entity);
/**
* 根据ID删除
* @param id 业务实体对象的标识
* @return 删除成功返回true否则返回false
*/
public boolean deleteById(K id);
/**
* 修改
* @param entity 业务实体对象
* @return 修改成功返回true否则返回false
*/
public void update(E entity);
/**
* 根据ID查业务实体对象
* @param id 业务实体对象的标识
* @return 业务实体对象对象或null
*/
public E findById(K id);
/**
* 根据ID查业务实体对象
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论