最近在研究 spring 源代码 先研究的第一个问题 session 是 怎么关闭的...
session.clear(); ?什么意思
public static void releaseSession(Session session, SessionFactory sessionFactory) {
if (session == null) {
return;
}
// Only close non-transactional Sessions.
if (!isSessionTransactional(session, sessionFactory)) {
closeSessionOrRegisterDeferredClose(session, sessionFactory);
}
}
这个方法 中 isSessionTransactional 是干什么?
static void closeSessionOrRegisterDeferredClose(Session session, SessionFactory sessionFactory) {
Map> holderMap = deferredCloseHolder.get();
if (holderMap != null && sessionFactory != null && holderMap.containsKey(sessionFactory)) {
logger.debug("Registering Hibernate Session for deferred close");
// Switch Session to FlushMode.MANUAL for remaining lifetime.
session.setFlushMode(FlushMode.MANUAL);
Set sessions = holderMap.get(sessionFactory);
sessions.add(session);
}
else {
closeSession(session);
}
}
closeSessionOrRegisterDeferredClose 方法 和 holderMap.containsKey ?
希望大侠不 吝赐教 ...
isSessionTransactional是用来判断该Session是否在事务中运行,为了保证事务的完整性,事务性的Session只有在最终方法结束的时候才能关闭,Spring在TransactionSynchronizationManager中保存了一个sessionHodler用存在关于某个session的事物信息,所以如果有对应的SessionHolder存在就代表是事务的; 关于第二个问题deffer应该是延迟的意思,所以closeSessionOrRegisterDeferredClose是用判断是否需要立即关闭;需要延迟关闭的session,Spring会在deferredCloseHolder中保存一个Map用于保存对应的SessionFactory和Session,所以holderMapcontainsKey是指当前这个session是否处于需要延迟的列表中,如果在就延迟关闭,否则立即关闭;
isSessionTransactional是用来判断该Session是否已经开启了事务
closeSessionOrRegisterDeferredClose是用判断是否立即关闭或延迟关闭
其实你看英文就差不多能明白了