我正在教Java EE,尤其是JPA,Spring和Spring MVC。由于我在大型项目方面没有太多经验,因此很难知道如何向学生介绍ORM的优化。
目前,我提出了一些经典的优化技巧:
社区是否还有其他方面可以了解优化ORM的其他方法?我对DAO模式特别感兴趣......
答案 0 :(得分:5)
从开发人员的角度来看,他必须处理以下优化案例:
所以我可以进行更多优化:
所有这些案例都符合“先写,后优化”规则(或“先表达意向,后来优化”)。
另一个众所周知的与优化相关的API是预取API (“预取路径”)。背后的想法是获取预期以最少的查询次数进行处理的对象图(或者更好,在最短的时间内)。所以这个API解决了“SELECT N + 1”问题。同样,这部分通常预计会在任何严肃的ORM产品中实施。
以上所有优化都是从事务隔离的角度来看是安全的 - 即它们不会破坏它。从这一点来看,与缓存相关的优化通常是不安全的:您必须仔细配置缓存,以确保在获取实际内容很重要时(例如,在安全检查或某些实时交互时),您将不会获得过时的对象。这里有很多技术,从使用内置缓存开始,与分布式缓存集成( memcached 等)。任何解决问题的方法都很好;我个人希望一个开放的API允许将任何一个与我喜欢的缓存集成。
P.S。我是一名.NET粉丝,以及DataObjects.Net和ORMeter.NET开发人员之一。所以我不知道在Java中如何实现完全相似的功能,但我熟悉可用解决方案的范围。
答案 1 :(得分:1)
N + 1查询集合怎么样?例如,请参见此处:ORM Select n + 1 performance; join or no join
答案 2 :(得分:1)
关于Spring和Spring MVC,您可能会发现this很有趣。 它是用C ++编写的,而不是Java,但它展示了如何减少UI源代码w.r.t.春天一个数量级。
答案 3 :(得分:1)
懒惰 - loading通过代理可能是ORM的杀手级功能之一。
此外,Hibernate还能够代理object.collection.count
之类的请求并对其进行优化,因此不会检索整个集合,只会导致SELECT Count(*)
问题。
答案 4 :(得分:1)
你提到了DAO模式,但JPA阵营中的很多人都说这种模式已经死了(我认为Hibernate的人已经在博客上写过这个,但我记不清了这个链接)。看一下Spring Roo,了解他们如何通过静态方法将ORM相关功能直接添加到域模型中。
答案 5 :(得分:1)