【问题标题】:JPA Lazy Load on non abstract objects非抽象对象上的 JPA 延迟加载
【发布时间】:2014-03-20 18:47:47
【问题描述】:

我正在尝试“调整”我的应用程序,并可能加快速度。我使用休眠作为我的 JPA 实现,并且我有一个名为 Product 的实体。它由名称、描述、id 和图像组成,在类定义中表示为 byte[]。

在“网络层端”,我有一个 servlet(ProductServlet),它的 GET 方法发出并从数据库中检索所有产品对象的列表,将它们作为属性放入请求中,然后转发到 JSP ,其中产品显示在表格中。

为了显示图像,(基于我在将字节 [] 数据显示为 JSP 中的图像时发现的一些建议)我有一个单独的 servlet(ImageServlet),其 GET 方法返回产品的 JPG 编码图像,其ID 传入。

我的问题是,有没有办法让图像(字节 [])“延迟加载”,这样当我向我的 ProductServlet 发出初始请求时,返回的产品列表没有图像( byte[]) 属性检索,直到我明确调用 product.getImage() (我假设这就是延迟加载的工作方式)。

这样,初始调用后端数据库获取产品列表更快,因为没有返回所有字节[]数据,然后当我需要获取时只获取字节[]图像部分图片(使用 ImageServlet)。

我试图在我的 byte[] 图像属性上设置惰性获取属性,但它说这是不允许的,我猜是因为它是标准 Java 类,而不是我自己定义的抽象类。

【问题讨论】:

    标签: java hibernate jsp servlets jpa


    【解决方案1】:

    在 JPA 2 中,您将列标记为 @Basic(fetch=FetchType.LAZY)。如果是 JPA 1,您可以创建一个 SimpleProduct 实体,该实体仅包含基本信息而没有图像。但是请注意,即使您的数据库没有返回列值(它不在 select 子句中),它也会从磁盘中读取。这是成本。

    我将保持第一步不变。加载所有产品后,我会将图像放入缓存中(您可以使用简单的Guava cache)并且应该从缓存中读取ImageServlet。将其设为短寿命缓存(例如 15 秒)并提供加载程序,以防图像不在缓存中,然后访问数据库。

    【讨论】:

    • 我很快就会接受你的回答,我想我得等几分钟。感谢您的建议,我将查看 Guava 缓存。我喜欢那个解决方案。我希望有一种简单的方法来显示来自 JSP 的图像,因为我已经有了 byte[],而不必使用单独的 servlet。
    • 您可以尝试将 Base64 图像放入 HTML 中,但这是错误的方式!最好在单独的 HTTP 调用中加载图像,因为 HTML 渲染会更快,并且图像的 GET 会更快地加载。
    猜你喜欢
    • 2011-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2018-03-09
    • 2019-09-20
    相关资源
    最近更新 更多