关于threadLocal问题

今天在打断点开jfinal_demo项目时,走了这一块时有点迷惑了:

	/**
	 * Get Connection. Support transaction if Connection in ThreadLocal
	 */
	public final Connection getConnection() throws SQLException {
		Connection conn = threadLocal.get();
		if (conn != null)
			return conn;
		return showSql ? new SqlReporter(dataSource.getConnection()).getConnection() : dataSource.getConnection();
	}
	
这一块,我认为,假设conn为null的话,不应该在return之前,
调用setThreadLocalConnection(dataSource.getConnection()),
把它保存到threadLocal里吗?或者能告诉我您在什么时候把connection设置到了threadLocal里面,谢谢!


评论区

JFinal

2016-10-23 16:16

这个地方是帮助控制事务,以及在 showSql 设置为 true 时代理 connection 来实现 sql 语句输出的,注意如下几点:
1:在 Tx 拦截器或者 Db.tx(...) 这类开启事务的方法中,会直接从 dataSource 获取 connection 开启事务,并放入该 threadLocal

2:真正使用 connection 的地方调用该 getConnection() 方法,如果 threadlocal 中有 conn 对象,直接使用,这样拿到手的就是前面 1 中设置的 connection

3:当 threadLocal 中没有 connection 的时候,证明没有开启事务,这时再从 dataSource 中去拿 connection,拿的时候根据 showSql 值来决定是不是要生成代理

热门反馈

扫码入社