知识卡片
延迟加载与会话边界的矛盾
内容
延迟加载让关联对象只在真正被访问时才从数据库读取,避免一次加载牵出整张对象图、浪费内 存和查询开销;但这份”透明”是有代价的——它依赖底层会话(数据库连接)仍然打开。一旦会 话关闭后再访问未初始化的关联,代理对象无法再悄悄查库,只能抛出异常。而会话又不能长时 间保持打开:它本质是一个数据库事务,占用共享的数据库资源,等待用户输入的同时hold住事 务,会让其他事务被阻塞或产生冲突。这两条约束(想省资源就要延迟加载,想安全就要在关闭 会话前访问完所有需要的数据)互相牵制,解法是让会话的生命周期与一个自然的操作边界对 齐——例如”一次HTTP请求”,而不是跟着用户交互的节奏走。发散:这正是后来”Open Session in View”模式要解决的问题,本质上是资源生命周期管理和数据可用性之间的经典张力,几乎所 有带连接池、带缓存代理的系统都会在某个层面重新遇到这个矛盾。
参考来源
《精通Hibernate》第5章《关联的主动加载和延迟加载》