阿阿阿飞翔阿 2009-06-04 23:21
浏览 215
已采纳

请教高手...

最近在研究 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 ?

希望大侠不 吝赐教 ...

  • 写回答

2条回答 默认 最新

  • layer555 2009-06-05 09:07
    关注

    isSessionTransactional是用来判断该Session是否在事务中运行,为了保证事务的完整性,事务性的Session只有在最终方法结束的时候才能关闭,Spring在TransactionSynchronizationManager中保存了一个sessionHodler用存在关于某个session的事物信息,所以如果有对应的SessionHolder存在就代表是事务的; 关于第二个问题deffer应该是延迟的意思,所以closeSessionOrRegisterDeferredClose是用判断是否需要立即关闭;需要延迟关闭的session,Spring会在deferredCloseHolder中保存一个Map用于保存对应的SessionFactory和Session,所以holderMapcontainsKey是指当前这个session是否处于需要延迟的列表中,如果在就延迟关闭,否则立即关闭;

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?