ThreadLocal讲解
- 线程容器,给线程绑定一个Object内容,然后只要线程不变,可以随时取出。
ThreadLocal<String> threadlocal = new ThreadLocal<String>();
new Thread() {
public void run() {
threadlocal.set("测试");
};
}.start();
String result = threadlocal.get();
System.out.println("结果为:"+result);
使用Filter模拟OpenSessionInView实现编程式事务
import java.io.IOException;
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 org.apache.ibatis.session.SqlSession;
import com.bjsxt.util.MybatisUtil;
@WebFilter("/*")
public class OpenSessionInView implements Filter{
@Override
public void destroy() {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// TODO Auto-generated method stub
//监听的基础要复习
SqlSession session = MybatisUtil.getSession();
try {
chain.doFilter(request, response);
session.commit();
} catch (Exception e) {
// TODO: handle exception
session.rollback();
e.printStackTrace();
}finally {
MybatisUtil.closeSession();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// TODO Auto-generated method stub
}
}
-
Mybatis工具类
- 在其中使用ThreadLocal目的时控制在一个进程中,只生成一个session
import java.io.IOException;
import java.io.InputStream;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
public class MybatisUtil {
private static SqlSessionFactory factory;
private static ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();
static {
InputStream is = null;
try {
is = Resources.getResourceAsStream("mybatis.xml");
} catch (IOException e) {
e.printStackTrace();
}
factory = new SqlSessionFactoryBuilder().build(is);
}
public static SqlSession getSession() {
SqlSession session = tl.get();
if(session==null)
{
session = factory.openSession();
tl.set(session);
}
return session;
}
public static void closeSession() {
SqlSession session = tl.get();
if(session!=null) {
session.close();
}
tl.set(null);
}
}