zoukankan      html  css  js  c++  java
  • (八)Filter&ThreadLocal实现处理事务

    ConnectionContext.java

    package com.aff.bookstore.web;
    
    import java.sql.Connection;
    
    public class ConnectionContext {
        private static ConnectionContext insetance = new ConnectionContext();
    
        public static ConnectionContext getInsetance() {
            return insetance;
        }
    
        private ThreadLocal<Connection> connectionThreadLocal = new ThreadLocal<>();
    
        public void bind(Connection connection) {
            connectionThreadLocal.set(connection);
        }
    
        public Connection get() {
            return connectionThreadLocal.get();
        }
    
        public void remove() {
            connectionThreadLocal.remove();
        }
    }

    TranactionFilter.java

    package com.aff.bookstore.filter;
    
    import java.io.IOException;
    import java.sql.Connection;
    import java.sql.SQLException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import com.aff.bookstore.db.JDBCUtils;
    import com.aff.bookstore.web.ConnectionContext;
    
    @WebFilter("/*")
    public class TranactionFilter implements Filter {
    
        public TranactionFilter() {
        }
    
        public void destroy() {
        }
    
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
                throws IOException, ServletException {
            Connection connection = null;
    
            try {
    
                // 1.获取连接
                connection = JDBCUtils.getConnection();
    
                // 2.开启事务
                connection.setAutoCommit(false);
    
                // 3.利用ThreadLocal 把连接和当前线程绑定
                ConnectionContext.getInsetance().bind(connection);
    
                // 4.把请求 转给,目标Servlet
                chain.doFilter(request, response);
    
                // 5.提交事务
                connection.commit();
    
            } catch (Exception e) {
                e.printStackTrace();
    
                // 6.回滚事务
                try {
                    connection.rollback();
                } catch (SQLException e1) {
                    e1.printStackTrace();
                }
                HttpServletResponse resp = (HttpServletResponse) response;
                HttpServletRequest req = (HttpServletRequest) request;
                resp.sendRedirect(req.getContextPath()+"/errror-1.jsp");
    
            } finally {
                // 7.解除连接
                ConnectionContext.getInsetance().remove();
    
                // 8.关闭连接
                JDBCUtils.release(connection);
            }
        }
    
        public void init(FilterConfig fConfig) throws ServletException {
        }
    
    }
    All that work will definitely pay off
  • 相关阅读:
    10分钟用JS实现微信 "炸屎"大作战
    基于nodejs 的多页面爬虫
    react+react-router 4.0+redux 构建购物车实战项目
    vue+websocket+express+mongodb实战项目(实时聊天)
    用vuejs仿网易云音乐(实现听歌以及搜索功能)
    js 实现 bind 的这五层,你在第几层?
    教你如何搭建一个自动化构建的博客
    vue-chat项目之重构与体验优化
    vue+websocket+express+mongodb实战项目(实时聊天)(二)
    css 多栏自适应布局
  • 原文地址:https://www.cnblogs.com/afangfang/p/12935338.html
Copyright © 2011-2022 走看看