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
  • 相关阅读:
    树链剖分 (模板) 洛谷3384
    ST表 (模板) 洛谷3865
    IOI 2005 River (洛谷 3354)
    IOI 2005 River (洛谷 3354)
    poj1094 Sorting It All Out
    poj1094 Sorting It All Out
    spfa(模板)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    HAOI 2006 受欢迎的牛 (洛谷2341)
    洛谷1850(NOIp2016) 换教室——期望dp
  • 原文地址:https://www.cnblogs.com/afangfang/p/12935338.html
Copyright © 2011-2022 走看看