【问题标题】:EclipseLink/JPA persisting large(blob) entity, performance issueEclipseLink/JPA 持久化大(blob)实体,性能问题
【发布时间】:2023-03-29 11:48:01
【问题描述】:

我有一个包含一些图像的 @Lob 字段很少的实体。当我执行以下方法时,

entityManager.persist(myEnity);

此方法会产生以下查询,由于我的表很大,因此需要很长时间才能执行。

SELECT id, img_1, img_2 FROM my_entity WHERE (ID = :1) FOR UPDATE;

我不希望执行此查询,因为我只想插入一行。

仅供参考,我有以下应用程序环境。

EJB 3.0
EclipseLink 2.3.0
JDK 1.6
WebLogic 10.3
Oracle 11g

【问题讨论】:

  • 需要多长时间?如果id 是主键,它也是一个索引,应该需要几毫秒。
  • 其实这个查询是在做负载测试的时候发现的。我还有其他插入/选择查询与此一起运行,并且与其他查询相比,这个查询非常慢。例如,其他插入查询每个占总负载的 5% 左右,而这个占 25%。

标签: jpa ejb-3.0 eclipselink


【解决方案1】:

Oracle 11 之前的 Oracle JDBC 驱动程序的 LOB 大小限制为 4k,因此写入 lob 的唯一方法是插入和清空 lob,然后选择返回的 lob 并将其写入。这就是你所看到的。

这是可配置的,仅当您的“eclipselink.target-database”为“Oracle8i”、“Oracle9i”、“Oracle10g”时才可配置。

对于 Oracle 11g,您应该使用“Oracle11”,该平台将不使用定位器,因为在 Oracle 11g 中不再需要它。为此,您可能需要使用最新版本 (2.4)。使用“Oracle”作为目标也不会使用定位器。

您还可以使用定制器禁用平台中的定位器使用,

platform.setShouldUseLocatorForLOBWrite(false);

【讨论】:

    猜你喜欢
    • 2011-08-04
    • 2016-03-28
    • 1970-01-01
    • 2016-01-23
    • 2014-02-13
    • 1970-01-01
    • 2013-11-06
    • 2017-06-22
    • 1970-01-01
    相关资源
    最近更新 更多