运用线程内部的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();