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 里推荐 使用的修饰符。

 

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值