今天在打断点开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里面,谢谢!
1:在 Tx 拦截器或者 Db.tx(...) 这类开启事务的方法中,会直接从 dataSource 获取 connection 开启事务,并放入该 threadLocal
2:真正使用 connection 的地方调用该 getConnection() 方法,如果 threadlocal 中有 conn 对象,直接使用,这样拿到手的就是前面 1 中设置的 connection
3:当 threadLocal 中没有 connection 的时候,证明没有开启事务,这时再从 dataSource 中去拿 connection,拿的时候根据 showSql 值来决定是不是要生成代理