事務處理中如何獲取同一個connection 對象


運用線程內部的map屬性,將對象綁定到ThreadLocal中:

具體實現:

1.新建一個綁定Connection對象的單例類

public class ConnectionBind {
    private ConnectionBind(){}
    private static ConnectionBind instance=new ConnectionBind();
    public static ConnectionBind getInstance() {
        return instance;
    }    
    private ThreadLocal<Connection> threadLocal=new ThreadLocal<>();
    
    //線程綁定
    public void bind(Connection connection){
        threadLocal.set(connection);
    }
    
    //獲取綁定的線程對象
    public Connection get(){
        return threadLocal.get();
    }
    
    //解出綁定
    public void remove(){
        threadLocal.remove();
    }    
}

2.新建一個ThreadLocationFilter過濾器,對所有的請求過濾,在doFilter方法中做如下實現:

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把當前連接和當前線程綁定
            ConnectionBind.getInstance().bind(connection);
            
            //4.把請求轉給目標Servlet
            chain.doFilter(request, response);
//5.提交事務 connection.commit(); } catch (Exception e) { //6.回滾事務 try { connection.rollback(); } catch (SQLException e1) { e1.printStackTrace(); }
       //重定向到錯誤頁面 HttpServletRequest request2
=(HttpServletRequest) request; HttpServletResponse response2=(HttpServletResponse) response; response2.sendRedirect(request2.getContextPath()+"/error-1.jsp"); }finally{ //7.解出綁定 ConnectionBind.getInstance().remove(); //8.關閉數據庫連接 JdbcUtils.releaseConnection(connection); } }

3.獲取同一個Connection連接對象

Connection connection=null;
connection=ConnectionBind.getInstance().get();

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM