修改
RTFM是JVM的新手,它假设servlet容器(在本例中为Jetty)为每个请求创建一个新的servlet实例:完全错误。
所以,下面的问题没有实际意义,上面确认了lazy vals确实是“永远”的事实(或者只要定义了lazy val的实例继续存在)
ORIGINAL 正如我now understand,在一个基本的servlet环境中,我们从每个HttpRequest的一个干净的平板开始。
这意味着每次请求都会重新招致 lazy val开销。
我担心的一个特殊问题是数据库查询语句缓存(通过延迟val)以及是否会导致不必要的性能损失;即,当应用程序服务器在每个请求生存和死亡时,在应用程序服务器上缓存查询语句的意义何在?
是的,使用连接池可以独立于请求范围缓存查询语句,大加;但是,这并没有解决每个请求上的ORM / JDBC-Wrapper将要经历相对昂贵的生成查询语句的操作的问题,缓存与否。
所以问题是:在servlet环境中查询缓存比帮助更多的障碍? (我正在使用ScalaQuery通过lazy val来缓存查询)
唯一有益处的情况是你在同一个请求中多次调用一个给定的查询,但这是我很少做的事情(大多只是为一个Foo或List运行一个查询[Foo]每次请求一次)