2

有人建议,为了提高我们系统的性能,应该全面使用延迟加载。也就是将带有“mappedBy”属性的 OneToOne 映射更改为 @OneToMany 映射。这是为了解决和停止从数据库加载不需要的数据,这会导致应用程序运行缓慢。

我们运行一个多层系统(基本上是 2 层)。我们有前端 - 使用 JSF 和包含业务和数据库访问层的后端。前后通信视图 EJB - 但 EJB 在其中没有真正的逻辑。使用的其他技术 - Spring 和 Hibernate

现在,在对该主题进行了一些阅读之后,似乎延迟加载的使用并不是灵丹妙药,因为它需要正确应用。对于每次延迟加载,都会发出一条 Select 语句来获取数据。还有一个问题是,如果前端访问要延迟加载的属性并且会话/连接在后端关闭,那么我们将得到一个空值。

以上是正确的担忧吗?

那么,在实施延迟加载解决方案或性能改进时,最好的方法/实践是什么?希望尽可能不要重做数据模型。

我最初的想法是与 DBA 团队合作,以了解两个系统之间发生的情况 - 查询的外观,我们如何使用数据等。识别问题点,检查 Hibernate 对象/查询以了解如何最好改进它。还要查看前端以确定数据从后端传递到前端以显示的内容和方式等。

好的方法/其他方法?

4

4 回答 4

8

您应该做的第一件事是测量您的应用程序并找出导致性能问题的确切原因。

使用 JProfiler 之类的工具找出问题所在。

一旦你知道发生了什么,你就可以决定如何解决它。

在不知道导致性能问题的原因的情况下直接实施延迟加载方案将浪费您的时间。

如果您发现 DB 层是您的问题所在,那么您可以让 DBA 参与进来,看看您的架构/查询是否可以在做任何更激进的事情之前得到改进。

于 2009-05-18T14:42:42.103 回答
2

It is true that if your fetching of data is slowing your load times down, then lazy loading is a great solution. But applying it across the board seems to be a premature optimization. You would probably want to impliment it for each set of data and then test to see if it speeds up the app. If it does not, then it is not a good candidate for the lazy loading.

The way I have implemented the lazy loading caused no change in the data tier. It was all down in the business logic and presentation controllers. As I am not familiar with EJB I am going to assume that this will work for your java app. Any way, When I implement the lazy loading, I load no data (atleat none of the data I am going to load lazily), until it is needed. Then I call the data tier and get my data (or a subset of the data).

As for the connection concern, you will need to put checks in place to test the data connection to see if it is closed. That is, is you are pooling the data connections. Then if the connection is closed, then reopen it. But as with the actual lazy loading implementation, this should be done in your logic classes and not in the front end, so you don't have to duplicate this functionality many times.

于 2009-05-18T14:50:22.460 回答
0

延迟加载非常适合延迟昂贵的操作,但我同意您的结论,即它不是解决所有性能问题的灵丹妙药。

跟随你的直觉,先做一些分析,看看应用程序中真正的性能问题在哪里。事实证明,延迟加载某些数据将是一个很好的解决方案,或者它可能是完全不同的东西。在您开始分析和分析应用程序内部发生的事情之前,真的没有办法知道。

于 2009-05-18T14:41:53.740 回答
0

这在很大程度上取决于您要做什么,很难说。你去找你的 DBA 的想法肯定会很有成效。人们唯一能做的就是提供一些例子。就我而言:

在以下场景中,延迟加载对我们来说是一个巨大的性能提升。我们有一棵巨大的树,有 15,000 个不同级别的节点。最初我们尝试加载整个树然后渲染它。花了很长时间。我们更改了代码以仅在用户扩展节点时才延迟加载分支。节点扩展需要稍长的时间,但应用程序整体感觉更快。在这种情况下,更改映射是有意义的

现在,如果您无论如何都需要处理整个树,因为它是您的业务逻辑所需要的,延迟加载不会有太大区别。在这种情况下,仅更改映射实际上是没有解决方案的,甚至可能更昂贵。

你需要稍微思考一下你的应用程序做了什么,它在哪里感觉很慢,你想要完成什么。拔出分析器也不是灵丹妙药。

如果没有来自您的应用程序的具体示例,那么说延迟加载是否有用是没有意义的。

于 2009-05-18T14:46:02.517 回答