事务处理中如何获取同一个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();