Spring学习笔记 二 防Spring事物控制

一, Conutils工具类:运用ThreadLocal为使每一个线程拥有同一个Connection对象。实现资源共享

public class Conutils {
    /**
     * Conutils类
     * 功能:为每个线程创建唯一的连接对象 ->用ThreadLocal来存储
     *   为什么需要Conutils?
     *      因为在处理事物时,
     *      只能有一个连接对象,如果有多个连接对象来处理事物
     *      当产生异常时,就无法回滚到原来的状态了
     * - 处理事物的步骤
     * 1.得到连接 设置手动提交
     * 2.通过该连接对象,进行增删改查操作。
     * 3.操作成功,提交事物。操作失败,回滚事物
     *
     */

    private ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
    private DataSource dataSource = null;

    //通过set方法进行注入

    //通过set方法进行注入
    public void setDataSource(DataSource dataSource) {
        this.dataSource = dataSource;
    }

    /**
     * 在ThreadLocal中获取连接对象,
     * 如果没有,新创建一个Connection,并赋值到ThreadLocal中
     * @param
     * @return
     * @throws SQLException
     */
    public Connection getThreadConnection() throws SQLException {
        Connection connection = threadLocal.get();
        if (connection != null) {
            return connection;
        } else {
            Connection ccon = dataSource.getConnection();
            threadLocal.set(ccon);
            return ccon;
        }
    }
    public void relese(){
        threadLocal.remove();
    }
}

二,TxManager事物管理类,从Conutils获取连接对象。我们在管理事务时,只需调用TxManager的方法即可。

public class TxManager {
    //事物管理类
    /**
     * 功能:保证一个线程的获取的连接对象只有一个
     */
    private Conutils conutils = null;


    //通过set进行注入
    public void setConutils(Conutils conutils) {
        this.conutils = conutils;
    }


    //设置事物提交
    public void Commit()  {
        try {
            conutils.getThreadConnection().commit();
        }catch (Exception e){
            throw new RuntimeException(e);
        }
    }
    //回滚
    public void RollBack() {
        try {
            conutils.getThreadConnection().rollback();
        }catch (Exception e){
            throw  new RuntimeException(e);
        }
    }
    //开始事物
    public void TxStart() {
        try {
            conutils.getThreadConnection().setAutoCommit(false);
        }catch (Exception e){
            throw  new RuntimeException(e);
        }
    }
    //释放连接

    /**
     * 要点:
     * 1.释放连接
     * 2.删除该线程ThreadLocal中的值
     *  原因:
     *    --  当我们再通过Datasource获取处理的连接,其实是在连接池中获取的,当我们调用close方法时,
     *   我们只是归还该连接到了连接池中,并没用真正的销毁连接,故当前的ThreadLocal中应该还持有这个连接的引用
     *   而我们下次获取时,连接不为空,不会创建连接。而存储在ThreadLocal中的连接已经被还到连接池中了,不能使用
     *   所以我们在释放资源的时候,要记得删除ThreadLocal中的值
     */
    public void relese(){
        try {
            conutils.getThreadConnection().close();
            conutils.relese();
        }catch (Exception e){
            throw  new RuntimeException(e);
        }
    }
}

主要思路:

  • 1.运用Threadlocal类实现资源共享
  • 2.对每个事物的处理需要用同一个connection进行操作,即拿到ThreadLocal的资源,是为了确保在当前线程下事物的连接对象只有一个。
  • 3.释放资源时:connection对象只是归还到连接池中,并没有被销毁,线程使用完毕后,线程也会归还到线程池中。
  • 当我们多次开启新的线程后,可能拿到原来的线程,因为Threadlocal绑定在线程上,而原来线程上的连接又没有被销毁,我们直接拿到的连接不可用(因为连接返回到连接池中了,而连接对象的引用还不为空),所以我们在释放资源时,也要释放在ThreadLocal中的资源。下次拿到的连接就是全新的连接了!
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring是一个开源的Java框架,用于构建企业级应用程序。它提供了一种轻量级的、非侵入式的开发方式,通过依赖注入和面向切面编程等特性,简化了Java应用程序的开发过程。 以下是关于Spring学习的一些笔记: 1. IoC(控制反转):Spring通过IoC容器管理对象的创建和依赖关系的注入。通过配置文件或注解,将对象的创建和依赖关系的维护交给Spring容器来管理,降低了组件之间的耦合度。 2. DI(依赖注入):Spring通过依赖注入将对象之间的依赖关系解耦。通过构造函数、Setter方法或注解,将依赖的对象注入到目标对象中,使得对象之间的关系更加灵活和可维护。 3. AOP(面向切面编程):Spring提供了AOP的支持,可以将与业务逻辑无关的横切关注点(如日志、事务管理等)从业务逻辑中分离出来,提高了代码的可重用性和可维护性。 4. MVC(模型-视图-控制器):Spring提供了一个MVC框架,用于构建Web应用程序。通过DispatcherServlet、Controller、ViewResolver等组件,实现了请求的分发和处理,将业务逻辑和视图展示进行了分离。 5. JDBC和ORM支持:Spring提供了对JDBC和ORM框架(如Hibernate、MyBatis)的集成支持,简化了数据库访问的操作,提高了开发效率。 6. 事务管理:Spring提供了对事务的支持,通过声明式事务管理和编程式事务管理,实现了对数据库事务的控制和管理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值