ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

javaweb学习--事务管理

2022-07-26 21:01:34  阅读:267  来源: 互联网

标签:事务管理 javaweb -- void Connection SQLException static import public


事务处理

1.事务管理在Dao层

2. 事务管理在业务层

实现:

涉及到的组件:
     - OpenSessionInViewFilter
     - TransactionManager
     - ThreadLocal
     - ConnUtil
     - BaseDAO

(1)拦截器(OpenSessionInViewFilter)

package com.fruits.filters;

import com.fruits.trans.TransactionManager;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
import java.sql.SQLException;

@WebFilter("*.do")
public class OpenSessionInViewFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        TransactionManager transactionManager = new TransactionManager();
        try {
            transactionManager.beginTrans(); // 开始事务
            filterChain.doFilter(servletRequest,servletResponse); // 放行
            transactionManager.commit(); //提交事务
        } catch (SQLException e) {
            e.printStackTrace();
            try {
                transactionManager.rollback(); //回滚事务
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
    @Override
    public void destroy() {
    }
}

(2)封装事务操作

public class TransactionManager {
    //该类用来封装事务的操作:开启事务、提交事务、关闭事务。。。

    //开启事务
    public void beginTrans() throws SQLException {
         ConnUtil.getConn().setAutoCommit(false); //获取连接,不自动提交
    }

    //提交事务
    public void commit() throws SQLException {
        ConnUtil.getConn().commit();
        ConnUtil.closeConn();
    }

    //回滚事务
    public void rollback() throws SQLException {
        ConnUtil.getConn().rollback();
        ConnUtil.closeConn();
    }

}

(3)获取数据库连接

package com.fruits.util;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnUtil {
    public static final String driver = "com.mysql.cj.jdbc.Driver";
    public static final String url =" jdbc:mysql://localhost:3306/mytest?useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false&serverTimezone=GMT%2B8";
    public static final String username =" root";
    public static final String password = "123456";
    
    private static ThreadLocal<Connection> threadLocal = new ThreadLocal<>();
    private static Connection createConn(){
        try {
            //加载驱动
            Class.forName(driver);
            //通过驱动管理器获取连接对象
            return DriverManager.getConnection(url,username,password);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return  null;
    }

    public static Connection getConn(){
        Connection conn = threadLocal.get(); //获取到Connection对象
        if(conn == null){
            conn = createConn();  //如果threadLocal为空,重新获取Connection对象
            threadLocal.set(conn);  //获取到Connection对象值就设置到threadLocal中
        }
        return threadLocal.get();  //重新获取到Connection对象
    }

    public static  void closeConn() throws SQLException {
        Connection conn = threadLocal.get(); //获取到Connection对象
        if(conn == null){
            return;
        }
        if(!conn.isClosed()){
            conn.close();
            threadLocal.set(null);
        }
    }
}

3. ThreadLocal 

ThreadLocal 本地线程:同一个线程中进行数据通信。通过set方法在当前线程上存储数据、通过get方法在当前线程上获取数据

- set方法源码分析:

     public void set(T value) {
         Thread t = Thread.currentThread(); //获取当前的线程
         ThreadLocalMap map = getMap(t);    //每一个线程都维护各自的一个容器(ThreadLocalMap)
         if (map != null)
             map.set(this, value);          //这里的key对应的是ThreadLocal,因为我们的组件中需要传输(共享)的对象可能会有多个(不止Connection)
         else
             createMap(t, value);           //默认情况下map是没有初始化的,那么第一次往其中添加数据时,会去初始化
     }

-get方法源码分析:

    public T get() {
         Thread t = Thread.currentThread(); //获取当前的线程
         ThreadLocalMap map = getMap(t);    //获取和这个线程(企业)相关的ThreadLocalMap(也就是工作纽带的集合)
         if (map != null) {
             ThreadLocalMap.Entry e = map.getEntry(this);   //this指的是ThreadLocal对象,通过它才能知道是哪一个工作纽带
             if (e != null) {
                 @SuppressWarnings("unchecked")
                 T result = (T)e.value;     //entry.value就可以获取到工具箱了
                 return result;
             }
         }
         return setInitialValue();
     }

 

标签:事务管理,javaweb,--,void,Connection,SQLException,static,import,public
来源: https://www.cnblogs.com/Joyce-mi7/p/16517876.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有