JForum源代码研究—ThreadLocal,用户特有的变量

JForumExecutionContext是一个很有意思的类!顾名思义,这是一个执行期或运行期上下文类。嗨,等于没说!先看其类变量:

private static ThreadLocal userData = new ThreadLocal();
private static Logger logger = Logger.getLogger(JForumExecutionContext.class);
private static Configuration templateConfig;
	
private Connection conn;
private ForumContext forumContext;
private SimpleHash context = new SimpleHash(ObjectWrapper.BEANS_WRAPPER);
private String redirectTo;
private String contentType;
private boolean isCustomContent;

private boolean enableRollback;
 

静态变量 logger 就不多说了。静态变量templateConfig, 这是freemarker 的经典用法,也不多说了。对于非静态变量,都是特定用户相关的 。即用户 A 的“ redirectTo ”与用户 B 的“ redirectTo ”值是不同的。 context 也是和用户相关,用户 A 可能会使用 context.put("userName", " 张三 ") ,而用户 B 可能会使用 context.put("userName", " 李四 ") ,在页面上可能会这样:你好, ${userName} 。每个用户的 HttpServletRequest HttpServletResponse 也是不同的,因此,forumContext也是和用户相关的。contentType、isCustomConent和enableRollback都是和特定用户相关的。

 

特别地,为什么 conn 也是和用户相关的呢?通常,数据库连接应该和用户没有关系啊!?关键是,当用户请求执行到最后,可能用户 A 要提交,而用户 B 要回滚,要做到这一点必须要记录用户 A 最初获得的是哪个 conn ,而不能随便从连接池中获得一个 conn ,因此, conn 也是和用户相关的。如果你查看JForum的诸多 DAO 方法,你会发现系统使用JForumExecutionContext.getConnection() 而不是从连接池中 来获得数据库连接。当然,当用户的请求被处理完毕后,要使用JForumExecutionContext. finish() 来释放数据库连接。

 

“每个用户都有自己独立的变量值”,联想一下“每个线程都有自己独立的变量值”,你一定会想起 ThreadLocal 的用法。这里 userData 是静态的,这是 ThreadLocal API 里推荐 使用的修饰符。

 

 

 

 

 

你可能感兴趣的:(DAO,freemarker)