在spring中如何配代码的事务管理
Spring+Hibernate+Atomikos配置JTA事务
Spring+Hibernate+Atomikos配置JTA事务例子1.依赖jar包2.配置文件(1)数据源、JTA事务配置文件src/applicationContext-common.xml<?xml version="1.0" encoding="GBK"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd/schema/context/schema/context/spring-context-2.5.xsd /schema/tx/schema/tx/spring-tx-2.5.xsd/schema/aop/schema/aop/spring-aop-2.5.xsd"><!--chh用户datasource --><bean id="oracleDataSource"class="com.atomikos.jdbc.AtomikosDataSourceBean"><property name="uniqueResourceName"><value>chh</value></property><propertyname="xaDataSourceClassName"><value>oracle.jdbc.xa.client.OracleXADat aSource</value></property><property name="xaProperties"><props><prop key="user">chh</prop><prop key="password">chh</prop><prop key="URL">jdbc:oracle:thin:@127.0.0.1:1521:chh</prop></props></property><property name="poolSize"><value>1</value></property><property name="borrowConnectionTimeout"><value>60</value></property> </bean><!--chh1用户datasource --><bean id="oracleDataSource1"class="com.atomikos.jdbc.AtomikosDataSourceBean"><property name="uniqueResourceName"><value>chh1</value></property><propertyname="xaDataSourceClassName"><value>oracle.jdbc.xa.client.OracleXADat aSource</value></property><property name="xaProperties"><props><prop key="user">chh1</prop><prop key="password">chh1</prop><prop key="URL">jdbc:oracle:thin:@127.0.0.1:1521:chh</prop></props></property><property name="poolSize"><value>1</value></property><property name="borrowConnectionTimeout"><value>60</value></property> </bean><!--为hibernate-jtatest1.cfg.xml注入chh用户datasource--><bean id="chhSessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"><property name="configLocation"value="classpath:hibernate-jtatest1.cfg.xml" /><property name="dataSource" ref="oracleDataSource"></property></bean><!--为hibernate-jtatest2.cfg.xml注入chh1用户datasource--><bean id="chh1SessionFactory"class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="configLocation"value="classpath:hibernate-jtatest2.cfg.xml" /><property name="dataSource" ref="oracleDataSource1"></property></bean><!-- atomikos事务管理器 --><bean id="atomikosTransactionManager"class="erTransactionManager"init-method="init" destroy-method="close"><property name="forceShutdown"><value>true</value></property></bean><!-- atomikos事务的实现 --><bean id="atomikosUserTransaction"class="erTransactionImp"><property name="transactionTimeout"><value>300</value></property> </bean><!-- atomiko事务管理器封装成Spring事务管理器--><bean id="springTransactionManager"class="org.springframework.transaction.jta.JtaTransactionManager"><property name="transactionManager"><refbean="atomikosTransactionManager" /></property><property name="userTransaction"><ref bean="atomikosUserTransaction" /></property><property name="allowCustomIsolationLevels" value="true"/></bean><!-- 通知配置 --><tx:advice id="txAdvice"transaction-manager="springTransactionManager"><tx:attributes><tx:method name="delete*" rollback-for="Exception"/><tx:method name="save*" rollback-for="Exception"/><tx:method name="update*" rollback-for="Exception"/><tx:method name="*" read-only="true" rollback-for="Exception"/></tx:attributes></tx:advice><!-- 事务切面配置 --><aop:config><aop:pointcut id="point"expression=" execution(* com.zte.jta.serviceImp.*.*(..))" /><!-- 指定使用jta事务的类、方法 --><aop:advisor advice-ref="txAdvice" pointcut-ref="point" /></aop:config></beans>(2) 业务配置文件src/applicationContext-service.xml<?xml version="1.0" encoding="GBK"?><beans xmlns="/schema/beans"xmlns:xsi="/2001/XMLSchema-instance"xmlns:context="/schema/context"xmlns:tx="/schema/tx"xmlns:aop="/schema/aop"xsi:schemaLocation="/schema/beans /schema/beans/spring-beans-2.5.xsd/schema/context/schema/context/spring-context-2.5.xsd /schema/tx/schema/tx/spring-tx-2.5.xsd/schema/aop/schema/aop/spring-aop-2.5.xsd"><bean id="biz" class="impl"><property name="productDao" ref="productDao" /><property name="userDao" ref="userDao" /></bean><bean id="userDao" class="erDaoimpl"><property name="sessionFactory" ref="chhSessionFactory" /></bean><bean id="productDao" class="com.zte.jta.daoImp.ProductDaoimpl"><property name="sessionFactory" ref="chh1SessionFactory" /></bean></beans>(3)数据源1 hibernate 配置文件src/hibernate-jtatest1.cfg.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><propertyname="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop erty><property name="show_sql">true</property><mapping resource="com/zte/jta/test/Users.hbm.xml" /></session-factory></hibernate-configuration>(3) 数据源2 hibernate 配置文件src/hibernate-jtatest2.cfg.xml<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC"-//Hibernate/Hibernate Configuration DTD 3.0//EN""/hibernate-configuration-3.0.dtd"><hibernate-configuration><session-factory><propertyname="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop erty><property name="show_sql">true</property><mapping resource="com/zte/jta/test/Product.hbm.xml" /></session-factory></hibernate-configuration>(4)对象映射关系数据配置文件src/com/zte/jta/test/Product.hbm.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="com.zte.jta.test.Product" table="product" ><id name="id" type="ng.Integer"><column name="id" /><generator class="sequence" ><param name="sequence">SEQ_product</param></generator></id><property name="price" type="ng.Float"><column name="price" precision="53" scale="0" not-null="true" /></property></class></hibernate-mapping>(5)对象映射关系数据配置文件src/com/zte/jta/testUsers.hbm.xml<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""/hibernate-mapping-3.0.dtd"><hibernate-mapping><class name="ers" table="tusers" ><id name="id" type="ng.Integer"><column name="id" /><generator class="sequence" ><param name="sequence">SEQ_tusers</param></generator></id><property name="name" type="ng.String"><column name="name" length="100" not-null="true" /> </property></class></hibernate-mapping>3.Java代码(1)src/com/zte/jta/dao/ProductDao.javapackage com.zte.jta.dao;import com.zte.jta.test.Product;public interface ProductDao {public abstract void save(Product p);}(2)src/com/zte/jta/dao/UserDao.javapackage com.zte.jta.dao;import ers;public interface UserDao {public abstract void save(Users u);}(3)src/com/zte/jta/daoImp/ProductDaoimpl.javapackage com.zte.jta.daoImp;importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;import com.zte.jta.dao.ProductDao;import com.zte.jta.test.Product;public class ProductDaoimpl extends HibernateDaoSupport implements ProductDao {public void save(Product p){this.getHibernateTemplate().save(p);}}(4)src/com/zte/jta/daoImp/UserDaoimpl.javapackage com.zte.jta.daoImp;importorg.springframework.orm.hibernate3.support.HibernateDaoSupport;import erDao;import ers;public class UserDaoimpl extends HibernateDaoSupport implements UserDao {public void save(Users u){this.getHibernateTemplate().save(u);}}(5)src/com/zte/jta/service/Biz.javapackage com.zte.jta.service;import com.zte.jta.test.Product;import ers;public interface Biz {public void save(Product p, Users u);}(6)src/com/zte/jta/serviceImp/Bizimpl.javapackage com.zte.jta.serviceImp;import com.zte.jta.dao.ProductDao;import erDao;import ;import com.zte.jta.test.Product;import ers;public class Bizimpl implements Biz {private ProductDao productDao = null;private UserDao userDao = null;public void save(Product p, Users u) {productDao.save(p);userDao.save(u);}public void setProductDao(ProductDao productDao) {this.productDao = productDao;}public void setUserDao(UserDao userDao) {erDao = userDao;}}4.数据库建对象create user chh identified by chh;create user chh identified by chh1;grant dba,resource,connect to chh;grant dba,resource,connect to chh1;grant select on sys.dba_pending_transactions to chh;grant select on sys.pending_trans$to chh;grant select on sys.dba_2pc_pending to chh;grant execute on sys.dbms_system to chh;grant select on sys.dba_pending_transactions to chh1; grant select on sys.pending_trans$to chh1;grant select on sys.dba_2pc_pending to chh1;grant execute on sys.dbms_system to chh1;create sequence chh.SEQ_tusersminvalue 1maxvalue 10000000000000000start with 1increment by 1cache 20order;create sequence chh1.SEQ_productminvalue 1maxvalue 10000000000000000start with 1increment by 1cache 20order;create table chh.TUSERS(ID INTEGER not null,NAME VARCHAR2(50)not null)tablespace MAPpctfree 10initrans 1maxtrans 255storage(initial 128Knext 128Kminextents 1maxextents unlimitedpctincrease 0);alter table TUSERSadd primary key(ID)using indextablespace MAPpctfree 10initrans 2maxtrans 255storage(initial 128Knext 128Kminextents 1maxextents unlimitedpctincrease 0);create table CHH1.PRODUCT (ID INTEGER not null, PRICE NUMBER not null)tablespace MAPpctfree 10initrans 1maxtrans 255storage(initial 128Knext 128Kminextents 1maxextents unlimitedpctincrease 0);alter table CHH1.PRODUCT add primary key(ID) using indextablespace MAPpctfree 10initrans 2maxtrans 255storage(initial 128Knext 128Kminextents 1maxextents unlimitedpctincrease 0);5.测试方法public static void main(String[] args) {ApplicationContext context = new ClassPathXmlApplicationContext(new String[]{"applicationContext-common.xml","applicationContext-service.xml"});BeanFactory bf = context;Biz biz = (Biz) bf.getBean("biz");Product p = new Product();p.setPrice(10f);Users u = new Users();u.setName(null); //非空字段插入一个空试试,再给个值试试 "aaa"biz.save(p, u);}。
datasourcetransactionmanager用法
datasourcetransactionmanager用法DataSourcetransactionmanager 是Spring 框架中用于管理数据库事务的一种重要的机制。
通过DataSourceTransactionManager,开发人员可以在Spring 应用中使用声明式事务进行数据库操作。
在本文中,我们将详细介绍DataSourceTransactionManager 的用法,并逐步回答相关问题。
第一步:导入依赖在使用DataSourceTransactionManager 之前,首先需要在项目的构建配置文件(如pom.xml)中添加相应的依赖。
在Spring 中,DataSourceTransactionManager 是由Spring JDBC 模块提供的,因此我们需要添加相应的Spring JDBC 依赖。
xml<dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.3.10</version></dependency>第二步:配置数据源DataSourceTransactionManager 需要一个有效的数据源来管理事务。
在Spring 应用中,数据源可以通过Spring 的配置文件(如applicationContext.xml)进行配置。
例如,我们可以使用基于连接池的数据源,如Apache Commons DBCP 或HikariCP。
xml<bean id="dataSource"class="org.apachemons.dbcp2.BasicDataSource"><property name="driverClassName" value="com.mysql.jdbc.Driver" /><property name="url"value="jdbc:mysql:localhost:3306/mydatabase" /><property name="username" value="username" /><property name="password" value="password" /></bean>第三步:配置事务管理器配置事务管理器是使用DataSourceTransactionManager 的关键步骤。
transactiontemplate异步的使用写法
TransactionTemplate是 Spring 框架中用于简化事务管理的类。
要使用TransactionTemplate执行异步操作,你需要结合@Async注解和 Spring 的任务调度功能。
1.添加依赖: 首先,确保你的项目中包含了 Spring 的任务调度依赖。
2.配置TransactionTemplate: 在 Spring 配置中,定义一个
TransactionTemplate bean。
3.创建异步事务方法: 使用@Async注解标记一个方法,并在方法内部使用
TransactionTemplate。
4.启动事务: 在需要的地方调用异步事务方法。
由于它是异步的,所以调用
后方法会立即返回。
事务将在后台执行。
5.启用异步支持: 你还需要在 Spring 的主配置类上添加@EnableAsync注
解来启用异步支持。
6.异常处理: 由于异步事务是在单独的线程中执行的,因此需要确保正确处
理任何抛出的异常,并考虑如何将它们传递回调用线程。
7.注意点: 使用异步事务时,需要确保你了解事务的隔离级别和传播行为,
以确保数据的一致性和完整性。
Spring事务配置的五种方式
Spring事务原理统观spring事务,围绕着两个核心PlatformTransactionManager和TransactionStatusspring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransactionManager,我们使用的事务管理类例如DataSourceTransactionManager等都是这个类的子类。
一般事务定义步骤:TransactionDefinition td = new TransactionDefinition();TransactionStatus ts = transactionManager.getTransaction(td);try{ //do sthmit(ts);}catch(Exception e){transactionManager.rollback(ts);}spring提供的事务管理可以分为两类:编程式的和声明式的。
编程式的,比较灵活,但是代码量大,存在重复的代码比较多;声明式的比编程式的更灵活。
编程式主要使用transactionTemplate。
省略了部分的提交,回滚,一系列的事务对象定义,需注入事务管理对象.void add(){transactionTemplate.execute( new TransactionCallback(){pulic Object doInTransaction(TransactionStatus ts){ //do sth}}}声明式:使用TransactionProxyFactoryBean:<bean id="userManager" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"><property name="transactionManager"><ref bean="transactionManager"/></property><property name="target"><ref local="userManagerTarget"/></property><property name="transactionAttributes"><props><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><prop key="*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean>围绕Poxy的动态代理能够自动的提交和回滚事务org.springframework.transaction.interceptor.TransactionProxyFactoryBeanPROPAGATION_REQUIRED--支持当前事务,如果当前没有事务,就新建一个事务。
详解SpringBoot中JdbcTemplate的事务控制
详解SpringBoot中JdbcTemplate的事务控制⽬录前⾔原⽣Jdbc的事务控制Spring的声明式事务控制尝试JdbcTemplate的事务控制TransactionTemplate的编程式事务控制前⾔JdbcTemplate是spring-jdbc提供的数据库核⼼操作类,那对JdbcTemplate进⾏事务控制呢?我的环境:spring-boot-2.1.3,druid-1.1.3。
原⽣Jdbc的事务控制即,批处理+⾃动提交的控制⽅式,public static void demo(String[] args) throws SQLException, ClassNotFoundException {String url = "jdbc:mysql://10.1.4.16:3306/szhtest";String username = "ababab";String password = "123456";String sql1 = "insert xx";String sql2 = "insert xx";Class.forName("com.mysql.jdbc.Driver");Connection conn = DriverManager.getConnection(url, username, password);Statement statement = conn.createStatement();// 获取到原本的⾃动提交状态boolean ac = conn.getAutoCommit();// 批处理多条sql操作statement.addBatch(sql1);statement.addBatch(sql2);// 关闭⾃动提交conn.setAutoCommit(false);try {// 提交批处理statement.executeBatch();// 若批处理⽆异常,则准备⼿动commitmit();} catch (Exception e) {e.printStackTrace();// 批处理抛异常,则rollbacktry {conn.rollback();} catch (SQLException ex) {ex.printStackTrace();}} finally {// 恢复到原本的⾃动提交状态conn.setAutoCommit(ac);if (statement != null) {try {statement.close();} catch (SQLException e) {e.printStackTrace();}}if (conn != null) {try {conn.close();} catch (SQLException e) {e.printStackTrace();}}}}Spring的声明式事务控制Bean的类或⽅法上加@Transactional,事务控制粒度较⼤,只能控制在⽅法级别,不能控制到代码粒度级别。
java事务实现方式
java事务实现方式
在Java中,事务是一组操作单元,它们被当作一个单一的工作单元来执行。
事务管理是确保数据库操作的一致性和可靠性的重要组成部分。
Java中常见的事务实现方式包括:
1、JDBC事务:
使用java.sql.Connection对象,通过调用setAutoCommit(false)来启用手动事务管理。
使用commit()提交事务或rollback()回滚事务。
2、Spring声明式事务管理:
使用@Transactional注解来声明事务。
配置事务管理器( 如DataSourceTransactionManager)。
3、使用Spring编程式事务管理:
使用TransactionTemplate来编程式管理事务。
4、JTA事务 Java(Transaction(API):
使用erTransaction接口。
通常用于分布式事务,涉及多个数据源。
这些是一些常见的Java事务实现方式,选择适合你应用场景的方式取决于你的需求和技术栈。
SpringBoot事务注解详解
SpringBoot事务注解详解SpringBoot事务注解详解@Transactionalspring 事务注解1.简单开启事务管理@EnableTransactionManagement // 启注解事务管理,等同于xml配置⽅式的 <tx:annotation-driven />2.事务注解详解默认遇到throw new RuntimeException(“…”);会回滚需要捕获的throw new Exception(“…”);不会回滚指定回滚@Transactional(rollbackFor=Exception.class)public void methodName() {// 不会回滚throw new Exception("...");}指定不回滚@Transactional(noRollbackFor=Exception.class)public ItimDaoImpl getItemDaoImpl() {// 会回滚throw new RuntimeException("注释");}如果有事务,那么加⼊事务,没有的话新建⼀个(不写的情况下)@Transactional(propagation=Propagation.REQUIRED)容器不为这个⽅法开启事务@Transactional(propagation=Propagation.NOT_SUPPORTED)readOnly=true只读,不能更新,删除@Transactional (propagation = Propagation.REQUIRED,readOnly=true)设置超时时间@Transactional (propagation = Propagation.REQUIRED,timeout=30)设置数据库隔离级别@Transactional (propagation = Propagation.REQUIRED,isolation=Isolation.DEFAULT)3.指定事务管理器spring Boot 使⽤事务⾮常简单,⾸先使⽤注解 @EnableTransactionManagement 开启事务⽀持后,然后在访问数据库的Service⽅法上添加注解 @Transactional 便可。
transactional 中添加transactiontemplate
transactional 中添加transactiontemplate transactional是Spring框架中的一个注解,用于为方法添加事务支持。
在使用transactional注解时,可以使用TransactionTemplate来更加灵活地管理事务的细节。
本文将详细介绍在transactional中添加TransactionTemplate的步骤和原理。
一、什么是transactional注解和TransactionTemplate?1. transactional注解transactional是Spring框架中的一个注解,用于为方法添加事务支持。
在使用transactional注解时,可以指定事务的传播行为、隔离级别、回滚规则等细节。
2. TransactionTemplateTransactionTemplate是Spring框架中的一个类,用于编程式地管理事务。
通过TransactionTemplate,可以更加灵活地控制事务的开始、提交和回滚操作。
二、为什么要在transactional中添加TransactionTemplate?1. 灵活控制事务事务的传播行为、隔离级别、回滚规则通常是在transactional注解中指定的。
但是有些情况下,我们可能需要根据特定的业务逻辑来动态地控制事务的开始、提交和回滚操作。
这时,就可以使用TransactionTemplate来实现更加灵活的事务管理。
2. 提高代码可读性通过在transactional注解中添加TransactionTemplate,可以将事务管理的细节从业务逻辑中分离出来,使代码更加清晰,易于阅读和维护。
三、在transactional中添加TransactionTemplate的步骤1. 导入依赖在pom.xml文件中添加Spring事务支持的依赖:xml<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId> </dependency>2. 添加EnableTransactionManagement注解在SpringBootApplication类上添加EnableTransactionManagement注解,开启Spring事务管理的支持:javaSpringBootApplicationEnableTransactionManagementpublic class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}3. 在方法上添加transactional注解在需要添加事务支持的方法上添加Transactional注解,并指定事务的传播行为、隔离级别和回滚规则:javaServicepublic class UserService {Autowiredprivate UserRepository userRepository;Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) public void updateUser(User user) {更新用户信息的业务逻辑}}4. 使用TransactionTemplate来控制事务在需要动态控制事务的方法内部,可以使用TransactionTemplate来开启、提交和回滚事务:javaServicepublic class UserService {Autowiredprivate UserRepository userRepository;Transactional(propagation = Propagation.REQUIRED, isolation = Isolation.DEFAULT, rollbackFor = Exception.class) public void updateUser(User user) {开始事务TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);transactionTemplate.setPropagationBehavior(TransactionDefinition .PROPAGATION_REQUIRED);TransactionStatus status = transactionTemplate.getTransactionManager().getTransaction(transactionTemplate);try {更新用户信息的业务逻辑userRepository.save(user);提交事务transactionTemplate.getTransactionManager()mit(status);} catch (Exception e) {回滚事务transactionTemplate.getTransactionManager().rollback(status);throw e;}}}四、TransactionTemplate的原理1. 提供事务功能的beanTransactionTemplate提供了事务管理的功能,通过与事务管理器(transactionManager)的结合使用,实现了管理事务的开始、提交和回滚操作。
spring事务详解(基于注解和声明的两种实现方式)
spring事务详解(基于注解和声明的两种实现⽅式)Spring事务( Transaction )事务的概念事务是⼀些sql语句的集合,作为⼀个整体执⾏,⼀起成功或者⼀起失败。
使⽤事务的时机⼀个操作需要多天sql语句⼀起完成才能成功程序中事务在哪⾥说明加在业务类的⽅法上⾯(public⽅法上⾯),表⽰业务⽅法执⾏时,需要事务的⽀持。
不同的事务管理器不同的数据库访问技术,处理事务是不同的1. 使⽤jdbc访问数据库,事务处理public void updateAccount(){Connection con = .....;con.setAutoCommit(false);state.insert();state.update();mit();con.setAutoCommit(true);}2. MyBatis执⾏数据库,处理事务public void updateAccount(){SqlSession sqlSession = SqlSessionFactory.openSession(false);try{sqlSession.insert(...);sqlSession.update(...);mit();}catch(Exception e){sqlSession.rollback();}}spring统⼀管理事务,把不同的数据库访问技术的事务处理统⼀起来使⽤spring的事务管理器,管理不同数据库访问技术的事务处理。
开发⼈员只需要掌握spring的事务处理⼀个⽅案,就可以实现使⽤不同数据库访问技术的事务管理。
尽管事务⾯向的是spring,有spring管理事务,做事务提交和回滚。
spring事务管理器spring框架使⽤事务管理器对象,管理所有的事务。
事务管理器接⼝: PlatFormTransactionManager作⽤:定义了事务的操作,主要是commit() , rollback()事务管理器有很多的实现类:⼀种数据库访问计数有⼀个实现类。
transactiontemplate中的execute的方法 -回复
transactiontemplate中的execute的方法-回复TransactionTemplate中的execute的方法是Spring框架提供的一种事务管理机制,它可以在应用程序中执行一组操作,并将这些操作包括在一个事务中。
在本文中,我们将一步一步地回答如何使用TransactionTemplate中的execute方法来实现事务管理。
第一步是在Spring配置文件中配置TransactionTemplate。
我们可以使用XML文件或注解来配置这个模板。
在XML配置文件中,我们需要导入所需的命名空间(tx)和定义事务管理器。
然后,需要定义一个TransactionTemplate bean,并将事务管理器注入到它里面。
这样就完成了TransactionTemplate的配置。
第二步是在需要进行事务管理的方法或者代码块内部调用TransactionTemplate的execute方法。
在这个方法或者代码块中,可以包含多个数据库操作、文件操作等需要进行事务管理的操作。
在执行每个操作之前,需要将该操作在TransactionTemplate的execute方法中包裹起来,这样Spring会自动为这些操作开启一个事务。
第三步是定义事务管理的属性。
可以在TransactionTemplate的execute 方法中定义一些事务属性来控制事务的行为。
例如,可以设置事务的隔离级别、传播行为等。
事务的隔离级别决定了事务之间的隔离程度,传播行为决定了事务的传播方式。
这些属性可以根据具体的业务需求进行配置。
第四步是在TransactionTemplate的execute方法中编写具体的业务逻辑。
可以在其中执行数据库操作、文件操作等。
由于这些操作都被包含在一个事务中,所以如果其中任何一个操作出现异常或者错误,整个事务都会被回滚到最初的状态。
第五步是根据业务需求选择是否在execute方法中添加事务回调。
事务回调可以在事务的不同阶段执行相应的操作。
platformtransactionmanager 用法
PlatformTransactionManager 是Spring 框架中的一个接口,用于管理事务,它提供了一种声明式方式来处理事务。
以下是使用PlatformTransactionManager 的基本步骤:1. 首先,需要在Spring 配置文件中定义一个TransactionManager bean。
例如:<bean id="transactionManager"class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/></bean>2. 然后,在需要处理事务的方法上,使用Transactional 注解。
例如:Transactionalpublic void doSomething() {// 这里是需要处理事务的代码}3. 最后,在启动Spring 容器时,需要将事务管理器bean 注入到需要处理事务的类中。
例如:Autowiredprivate PlatformTransactionManager transactionManager;这样,当调用doSomething() 方法时,Spring 会自动将transactionManager 注入到该方法中,并使用transactionManager 来管理事务。
需要注意的是,PlatformTransactionManager 接口的实现类有多种,例如DataSourceTransactionManager、JdbcTransactionManager 等,具体使用哪种实现类需要根据具体的需求来选择。
同时,还需要注意事务的传播行为、隔离级别等配置。
Spring多数据源事务配置问题
Spring多数据源事务配置问题第⼀步、测试能否配置多个DataSource第⼆步、测试能否配置多个SessionFactory第三步、测试能否配置多个TransactionManager第四步、测试能否使⽤多个TransactionManager,也就是看能否配置多个<tx:annotation-driven/>基本上到第四步就应该⾛不通了,因为Spring中似乎不能配置多个<tx:annotation-driven/>,⽽且@transactional注解也⽆法让⽤户选择具体使⽤哪个TransactionManager。
也就是说,在SpringSide的应⽤中,不能让不同的数据源分别属于不同的事务管理器,多数据源只能使⽤分布式事务管理器,那么测试思路继续如下进⾏:第五步、测试能否配置JTATransactionManager如果到这⼀步,项⽬还能顺利在Tomcat中运⾏的话,我们就算⼤功告成了。
但我总认为事情不会那么顺利,我总觉得JTATransactionManager需要应⽤服务器的⽀持,⽽且需要和JNDI配合使⽤,具体是不是这样,那只有等测试后才知道。
如果被我不幸⾔中,那么进⾏下⼀步:第六步、更换Tomcat为GlassFish,更换JDBC的DataSource为JNDI查找的DataSource,然后配置JTATransactionManager下⾯测试开始,先假设场景,还是继续⽤上⼀篇中提到的简单的⽂章发布系统,假设该系统运⾏⼀段时间后⾮常⽕爆,单靠⼀台服务器已经⽆法⽀持巨⼤的⽤户数,这时候,站长想到了把数据进⾏⽔平划分,于是,需要建⽴⼀个索引数据库,该索引数据库需保存每⼀篇⽂章的Subject及其内容所在的Web服务器,⽽每⼀个Web服务器上运⾏的项⽬,需要同时访问索引数据库和内容数据库。
所以,需要创建索引数据库,如下:create database puretext_index;use puretext_index;create table articles(id int primary key auto_increment,subject varchar(256),webserver varchar(30));第⼀步测试,配置多个DataSource,配置⽂件如下:application.properties:jdbc.urlContent=jdbc:mysql://localhost:3306/PureText?useUnicode=true&characterEncoding=utf8jdbc.urlIndex=jdbc:mysql://localhost:3306/PureText_Index?useUnicode=true&characterEncoding=utf8applicationContext.xml:<?xml version="1.0" encoding="UTF-8"?><beans xmlns="mons.dbcp.BasicDataSource" destroy-method="close"><!-- Connection Info --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="${jdbc.urlContent}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/><!-- Connection Pooling Info --><property name="initialSize" value="5"/><property name="maxActive" value="100"/><property name="maxIdle" value="30"/><property name="maxWait" value="1000"/><property name="poolPreparedStatements" value="true"/><property name="defaultAutoCommit" value="false"/></bean><bean id="dataSourceIndex" class="mons.dbcp.BasicDataSource" destroy-method="close"><!-- Connection Info --><property name="driverClassName" value="com.mysql.jdbc.Driver"/><property name="url" value="${jdbc.urlIndex}"/><property name="username" value="${ername}"/><property name="password" value="${jdbc.password}"/><!-- Connection Pooling Info --><property name="initialSize" value="5"/><property name="maxActive" value="100"/><property name="maxIdle" value="30"/><property name="maxWait" value="1000"/><property name="poolPreparedStatements" value="true"/><property name="defaultAutoCommit" value="false"/></bean><!-- 数据源配置,使⽤应⽤服务器的数据库连接池 --><!--<jee:jndi-lookup id="dataSource" jndi-name="java:comp/env/jdbc/ExampleDB" />--><!-- Hibernate配置 --><bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"><property name="dataSource" ref="dataSourceContent"/><property name="namingStrategy"><bean class="org.hibernate.cfg.ImprovedNamingStrategy"/></property><property name="hibernateProperties"><props><prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop><prop key="hibernate.show_sql">${hibernate.show_sql}</prop><prop key="hibernate.format_sql">${hibernate.format_sql}</prop><prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop><prop key="hibernate.cache.provider_configuration_file_resource_path">${hibernate.ehcache_config_file}</prop></props></property><property name="packagesToScan" value="cn.puretext.entity.*"/></bean><!-- 事务管理器配置,单数据源事务 --><bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"><property name="sessionFactory" ref="sessionFactory"/></bean><!-- 事务管理器配置,多数据源JTA事务--><!--<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager orWebLogicJtaTransactionManager" />--><!-- 使⽤annotation定义事务 --><tx:annotation-driven transaction-manager="transactionManager"/></beans>这个时候运⾏上⼀篇⽂章中写好的单元测试DaoTest.java,结果发现还是会出错,错误原因如下:org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'cn.puretext.unit.service.DaoTest': Autowiring of methods failed; nested exception is org.springframework.beans.factory.BeanCreationException: Could not autowire method: public void org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests.setDataSource(javax.sql.DataSource); nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No unique bean of type [javax.sql.DataSource] is defined: expected single matching bean but found 2: [dataSourceContent, dataSourceIndex]经过分析,发现是测试类的基类需要注⼊DataSource,⽽现在配置了多个DataSource,所以Spring不知道哪个DataSource匹配了,所以需要改写DaoTest.java,如下:package cn.puretext.unit.service;import java.util.List;import javax.annotation.Resource;import javax.sql.DataSource;import org.junit.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springside.modules.orm.Page;import org.springside.modules.test.junit4.SpringTxTestCase;import cn.puretext.dao.ArticleDao;import cn.puretext.entity.web.Article;public class DaoTest extends SpringTxTestCase {@Autowiredprivate ArticleDao articleDao;public ArticleDao getArticleDao() {return articleDao;}public void setArticleDao(ArticleDao articleDao) {this.articleDao = articleDao;}@Override@Resource(name = "dataSourceContent")public void setDataSource(DataSource dataSource) {// TODO Auto-generated method stubsuper.setDataSource(dataSource);}@Testpublic void addArticle() {Article article = new Article();article.setSubject("article test");article.setContent("article test");articleDao.save(article);}@Testpublic void pageQuery() {Page<Article> page = new Page<Article>();page.setPageSize(10);page.setPageNo(2);page = articleDao.getAll(page);List<Article> articles = page.getResult();}}改变的内容主要为重写了基类中的setDataSource⽅法,并使⽤@Resource注解指定使⽤的DataSource为dataSourceContent。
spring,mybatis事务管理配置与@Transactional注解使用[转]
spring,mybatis事务管理配置与@Transactional注解使用[转]spring,mybatis事务管理配置与@Transactional注解使用概述事务管理对于企业应用来说是至关重要的,即使出现异常情况,它也可以保证数据的一致性。
Spring Framework对事务管理提供了一致的抽象,其特点如下:为不同的事务API提供一致的编程模型,比如JTA(Java Transaction API), JDBC, Hibernate, JPA(Java Persistence API和JDO(Java Data Objects)支持声明式事务管理,特别是基于注解的声明式事务管理,简单易用提供比其他事务API如JTA更简单的编程式事务管理API与spring数据访问抽象的完美集成事务管理方式spring支持编程式事务管理和声明式事务管理两种方式。
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。
对于编程式事务管理,spring推荐使用TransactionTemplate。
声明式事务管理建立在AOP之上的。
其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中。
显然声明式事务管理要优于编程式事务管理,这正是spring 倡导的非侵入式的开发方式。
声明式事务管理使业务代码不受污染,一个普通的POJO对象,只要加上注解就可以获得完全的事务支持。
和编程式事务相比,声明式事务唯一不足地方是,后者的最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。
springboot中事务管理@Transactional的注意事项与使用场景
springboot中事务管理@Transactional的注意事项与使⽤
场景
前⾔:在service层的⽅法上使⽤@Transactional 即可实现处理数据库发⽣错误时触发事务回滚机制。
注意:
Spring 基于注解的声明式事物 @Transactional 默认情况下只会对运⾏期异常(ng.RuntimeException及其⼦类)和Error 进⾏回滚。
数据库引擎要⽀持事物,使⽤InnoDB。
@Transactional 只能被应⽤到public⽅法上, 对于其它⾮public的⽅法,如果标记了@Transactional也不会报错,但⽅法没有事务功能.
具体使⽤场景:
在service⽅法中不使⽤try-catch显⽰处理异常,直接throw new runtimeexcetpion()可实现事务回滚
在service⽅法中使⽤try-catch,但是需要在catch中加上throw new runtimeexcetpion()可实现事务回滚
注意当⽅法加上synchronized时,由于锁的作⽤范围⽐事务的作⽤范围⼩,因此应该修改锁的作⽤范围,保证锁的范围⽐事务的范围⼤即可。
总结
以上就是这篇⽂章的全部内容了,希望本⽂的内容对⼤家的学习或者⼯作具有⼀定的参考学习价值,谢谢⼤家对的⽀持。
如果你想了解更多相关内容请查看下⾯相关链接。
transactiontemplate使用
transactiontemplate使用xTransactionTemplate使用一、简介TransactionTemplate是Spring事务管理模块中提供的用于管理事务的一个类,它可以很方便的实现在不同的事务管理器之间自由切换。
TransactionTemplate提供了一个execute()方法,通过传递一个TransactionCallback参数,使用它来执行事务,不需要了解事务的实现细节,只需要把要处理的数据库操作放到TransactionCallback中即可。
二、使用方法1、在Spring配置文件中开启事务声明:<tx:annotation-driven transaction-manager='transactionManager'/><bean id='transactionManager'class='org.springframework.jdbc.datasource.DataSourceTransa ctionManager'><property name='dataSource' ref='dataSource'/></bean>2、然后定义一个用于处理事务和操作数据的Service,注意在方法上面声明@Transactional注解:@Servicepublic class UserService {@Transactionalpublic void saveUser(User user) {// do something...}}3、在业务逻辑类中定义TransactionTemplate:@Autowiredprivate DataSourceTransactionManager transactionManager;private TransactionTemplate transactionTemplate;public void init() {transactionTemplate = newTransactionTemplate(transactionManager);}4、在@Transactional标记的方法里调用以上定义的TransactionTemplate:public void saveUser(final User user) {// 调用TransactionTemplate定义的execute()方法执行数据库操作transactionTemplate.execute(newTransactionCallback<User>() {@Overridepublic User doInTransaction(TransactionStatus status) { // do something...return user;}});}t5、最后,在@Transactional标记的方法里,可以根据需要去改变事务的隔离级别和传播行为:@Transactional(isolation = Isolation.DEFAULT, propagation = Propagation.REQUIRED)public void saveUser(final User user) {// 调用TransactionTemplate定义的execute()方法执行数据库操作transactionTemplate.execute(newTransactionCallback<User>() {@Overridepublic User doInTransaction(TransactionStatus status) { // do something...return user;}});}三、总结TransactionTemplate能够自由切换事务管理器,提供了一个execute()方法来实现在不同事务管理器之间自由切换,并简化了事务处理的步骤,可以在@Transactional标记的方法里改变事务的隔离级别和传播行为,使得事务处理更加灵活。
Spring中@Transactional用法详细介绍
Spring中@Transactional⽤法详细介绍Spring中@Transactional⽤法详细介绍引⾔:在spring中@Transactional提供⼀种控制事务管理的快捷⼿段,但是很多⼈都只是@Transactional简单使⽤,并未深⼊了解,其各个配置项的使⽤⽅法,本⽂将深⼊讲解各个配置项的使⽤。
1. @Transactional的定义Spring中的@Transactional基于动态代理的机制,提供了⼀种透明的事务管理机制,⽅便快捷解决在开发中碰到的问题。
在现实中,实际的问题往往⽐我们预期的要复杂很多,这就要求对@Transactional有深⼊的了解,以来应对复杂问题。
⾸先我们来看看@Transactional的代码定义:@Target({ElementType.METHOD, ElementType.TYPE})@Retention(RetentionPolicy.RUNTIME)@Inherited@Documentedpublic @interface Transactional {/*** A qualifier value for the specified transaction.* <p>May be used to determine the target transaction manager,* matching the qualifier value (or the bean name) of a specific* {@link org.springframework.transaction.PlatformTransactionManager}* bean definition.*/String value() default "";/*** The transaction propagation type.* Defaults to {@link Propagation#REQUIRED}.* @see org.springframework.transaction.interceptor.TransactionAttribute#getPropagationBehavior()*/Propagation propagation() default Propagation.REQUIRED;/*** The transaction isolation level.* Defaults to {@link Isolation#DEFAULT}.* @see org.springframework.transaction.interceptor.TransactionAttribute#getIsolationLevel()*/Isolation isolation() default Isolation.DEFAULT;/*** The timeout for this transaction.* Defaults to the default timeout of the underlying transaction system.* @see org.springframework.transaction.interceptor.TransactionAttribute#getTimeout()*/int timeout() default TransactionDefinition.TIMEOUT_DEFAULT;/*** {@code true} if the transaction is read-only.* Defaults to {@code false}.* <p>This just serves as a hint for the actual transaction subsystem;* it will <i>not necessarily</i> cause failure of write access attempts.* A transaction manager which cannot interpret the read-only hint will* <i>not</i> throw an exception when asked for a read-only transaction.* @see org.springframework.transaction.interceptor.TransactionAttribute#isReadOnly()*/boolean readOnly() default false;/*** Defines zero (0) or more exception {@link Class classes}, which must be a* subclass of {@link Throwable}, indicating which exception types must cause* a transaction rollback.* <p>This is the preferred way to construct a rollback rule, matching the* exception class and subclasses.* <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(Class clazz)}*/Class<? extends Throwable>[] rollbackFor() default {};/*** Defines zero (0) or more exception names (for exceptions which must be a* subclass of {@link Throwable}), indicating which exception types must cause* a transaction rollback.* <p>This can be a substring, with no wildcard support at present.* A value of "ServletException" would match* {@link javax.servlet.ServletException} and subclasses, for example.* <p><b>NB: </b>Consider carefully how specific the pattern is, and whether* to include package information (which isn't mandatory). For example,* "Exception" will match nearly anything, and will probably hide other rules.* "ng.Exception" would be correct if "Exception" was meant to define* a rule for all checked exceptions. With more unusual {@link Exception}* names such as "BaseBusinessException" there is no need to use a FQN.* <p>Similar to {@link org.springframework.transaction.interceptor.RollbackRuleAttribute#RollbackRuleAttribute(String exceptionName)}*/String[] rollbackForClassName() default {};/*** Defines zero (0) or more exception {@link Class Classes}, which must be a* subclass of {@link Throwable}, indicating which exception types must <b>not</b>* cause a transaction rollback.* <p>This is the preferred way to construct a rollback rule, matching the* exception class and subclasses.* <p>Similar to {@link org.springframework.transaction.interceptor.NoRollbackRuleAttribute#NoRollbackRuleAttribute(Class clazz)}*/Class<? extends Throwable>[] noRollbackFor() default {};/*** Defines zero (0) or more exception names (for exceptions which must be a* subclass of {@link Throwable}) indicating which exception types must <b>not</b>* cause a transaction rollback.* <p>See the description of {@link #rollbackForClassName()} for more info on how* the specified names are treated.* <p>Similar to {@link org.springframework.transaction.interceptor.NoRollbackRuleAttribute#NoRollbackRuleAttribute(String exceptionName)}*/String[] noRollbackForClassName() default {};}基于源代码,我们可以发现在@Transactional,原来有这么多的属性可以进⾏配置,从⽽达到复杂应⽤控制的⽬的。
springboot整合多数据源以及多数据源中的事务处理
springboot整合多数据源以及多数据源中的事务处理前⾔本篇⽂章主要介绍的是springboot整合多数据源以及多数据源事务处理。
多数据源就是在同⼀个项⽬中连接多个数据库,使⽤多个数据库可能是由于业务量扩⼤进⾏数据库拆分,也可能是根据项⽬实际情况需要连接多个数据库。
⽐如我之前有个项⽬,需要访问⼀个已有的数据库进⾏查询操作,但不能修改,还需要新建数据库表进⾏其他的业务处理,这时就需要使⽤多数据源。
GitHub源码链接位于⽂章底部。
创建数据库创建member数据库,添加⼀张user表,字段为id主键⾃增,name,age;创建order数据库,添加⼀张order表,字段为id主键⾃增,number;⼯程结构先来看⼀下⼯程结构,这⾥的demo使⽤会员数据库和订单数据库,建⽴member和order相关包和类。
引⼊依赖在pom⽂件中引⼊依赖,这⾥持久层框架使⽤的是mybatis,数据库引擎是mysql。
不过oracle也适⽤。
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.3.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><!-- MySQL 连接驱动依赖 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.39</version></dependency><dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>1.3.2</version></dependency></dependencies>yml配置在application.yml中进⾏数据源配置server:port: 8080spring:datasource:member:jdbc-url: jdbc:mysql://localhost:3306/member?useUnicode=true&characterEncoding=utf-8username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driverorder:jdbc-url: jdbc:mysql://localhost:3306/order?useUnicode=true&characterEncoding=utf-8username: rootpassword: rootdriver-class-name: com.mysql.jdbc.Driver这⾥数据源的url的key是'jdbc-url',在多数据源的情况下,使⽤'url'作为key会报错,这是它本⾝的⼀个bug。
transactiontemplate声明式
transactiontemplate声明式标题:深入理解Spring的TransactionTemplate声明式事务管理一、引言在Java企业级应用开发中,事务管理是不可或缺的一部分。
为了简化事务管理的操作,Spring框架提供了一种基于AOP(面向切面编程)的声明式事务管理方式,其中就包括了使用TransactionTemplate来实现。
二、什么是TransactionTemplateTransactionTemplate是Spring框架提供的一个类,用于帮助我们以编程的方式进行声明式的事务管理。
它内部封装了对PlatformTransactionManager接口的调用,使得我们可以直接通过操作TransactionTemplate来进行事务管理,而无需关心底层的具体实现。
三、如何使用TransactionTemplate1. 配置TransactionTemplate首先,我们需要在Spring的配置文件中配置一个TransactionTemplate 实例,并将其注入到需要使用事务管理的类中。
xml<bean id="transactionTemplate"class="org.springframework.transaction.support.TransactionTempl ate"><property name="transactionManager"ref="transactionManager"/></bean>这里,transactionManager属性是必须的,它引用的是实现了PlatformTransactionManager接口的实例,通常我们使用的是DataSourceTransactionManager或者JtaTransactionManager。
Spring事务管理及与mybatis整合的事务管理
数据访问事务处理in Spring+Mybatis3.0事务---保证了用户的每一次操作都是可靠的,即使出现了异常的访问,也不至于破坏后台数据的完整性;Java事务简介事务必须符合ISO/IEC所定制的ACID原则1)A(atomicity):原子性在事务执行的过程中,任何的失败就将导致事务的任何修改失效,2)C(consistency):一致性事务回滚时,事务所执行的内容必须恢复到初始状态,即事务执行前的状态3)I(isolation):隔离性事务执行过程中对数据的修改,在提交之前的数据对其他事务不可见4)D(durability):持久性已经提交的数据在事务执行失败时,数据的状态都是正确的.事务分类:全局事务(分布式事务):由应用服务器来管理(如JTA),同时可以用于多个事务性的资源;本地事务本地事务和资源相关,主要通过JDBC来实现在实际应用中,存在一种容器管理事务,容器事务主要是由javaEE应用服务器提供,容器事务大多给予JTA完成,事实上这是在容器中覆盖了JDBC和JTA事务.事务特性分析(use spring)TransactionDefinition 接口来定义事务属性。
Code:public interface TransactionDefinition{int getIsolationLevel();int getPropagationBehavior();int getTimeout();boolean isReadOnly();}事务机制a)事务隔离级别隔离级别是指若干个并发的事务之间的隔离程度。
TransactionDefinition 接口中定义了五个表示隔离级别的常量:TransactionDefinition.ISOLATION_DEFAULT(默认值):表示使用底层数据库的默认隔离级别。
对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
spring学习7:纯注解整合mybatis和事务控制
spring学习7:纯注解整合mybatis和事务控制⽬录spring学习7: 纯注解整合mybatis和事务控制本⽂记录下如何利⽤纯注解的⽅式整合spring和mybatis⼀、引⼊依赖需要引⼊的依赖包括spring、mybatis、mybatis-spring、数据库驱动、连接池<dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-jdbc</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-tx</artifactId><version>5.1.5.RELEASE</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis-spring</artifactId><version>1.3.2</version></dependency><dependency><groupId>org.mybatis</groupId><artifactId>mybatis</artifactId><version>3.4.5</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.46</version></dependency><!--连接池--><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.11</version></dependency>⼆、整合过程2.1 整合原理本⽂中sql语句是写在xml⽂件中的mybatis-spring提供了⼀个SqlSessionFactoryBean类,创建该类的对象添加到容器中,然后再⽤MapperScan注解指定要扫描的dao层接⼝的包路径。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在spring中如何配代码的事务管理
在J2EE的web应用里面配置spring非常简单,最简单的只需要把spring得ContextLoaderListener添加到你的web.xml文件里面就可以了,示例如下:org.springframework.web.context.ContextLoaderListener ContextLoaderListener是一个ServletContextListener, 它在你的web应用启动的时候初始化。
缺省情况下,它会在WEB-INF/applicationContext.xml文件找Spring的配置。
你可以通过定义一个元素名字为”contextConfigLocation”来改变Spring 配置文件的位置。
示例
使用”org.springframework.jdbc.datasource.DriverManagerDataSou rce”数据源来配置数据库驱动。
示例如下:org.hsqldb.jdbcDriver jdbc:hsqldb:db/appfuse sa
spring提供了几个关于事务处理的类:TransactionDefinition //事务属性定义TranscationStatus //代表了当前的事务,可以提交,回滚。
PlatformTransactionManager这个是spring提供的用于管理事务的基础接口,其下有一个实现的抽象类AbstractPlatformTransac
在context中定义DataSource,创建SessionFactoy,设置参
数;DAO类继承HibernateDaoSupport,实现具体接口,从中获得HibernateTemplate进行具体操作。
在使用中如果遇到OpenSessionInView的问题,可以添加OpenSessionInViewFilter 或OpenSessionInViewIntercepto
一个类需要用到某个接口的方法,我们需要将类A和接口B的实现关联起来,最简单的方法是类A中创建一个对于接口B的实现C 的实例,但这种方法显然两者的依赖(Dependency)太大了。
而IoC 的方法是只在类A中定义好用于关联接口B的实现的方法,将类A,接口B和接口B的。