運用線程內部的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();