我正在电子商务网站的 Java Spring 应用程序中实现两个实体之间的关系,使用 PostgreSQL 作为数据库。涉及的实体有:
用户(带有标识符 id_user)。 ArticoloPolicySconto(带有复合键:id_articolo 和 politica_sconto_id)。 这些实体之间的关系定义为@ManyToMany。具体来说:
User实体有一个字段idPoliticaSconto,对应articolo_politica_sconto.idPoliticaScontoVers。 articolo_politica_sconto 表中的每个 idPoliticaScontoVers 可以与多篇文章关联。
问题: 当我在用户和相应的 ArticoliPoliticheSconto 之间建立关联时,由于每次加载期间 PoliticaSconto 表和 Articoli 表之间的另一个关系都会被调用(7000 条和一些记录),因此涉及的数据总共约为 35,000,000 条记录,如果自动加载或处理关系,则会对性能产生重大影响(无限加载数据,估计需要 1 周),例如在应用程序启动。
问题: 是否可以配置关联,以便仅在调用特定方法(例如,基于 user_id)时加载数据,从而避免在应用程序启动阶段加载整个关系?目标是优化查询并减少时间,避免同时管理所有数据。
换句话说,请求是为了知道是否可以配置延迟加载或类似策略的关系,以减少初始化期间的数据管理开销。
我已经尝试过批处理模式和获取类型急切模式下的调用。我希望有一种快速的方法来仅加载登录用户需要的数据,特别是他的价格,而不是整个数据库。
听起来由于关系映射中加载的数据量很大,您正在处理一个严重的性能瓶颈。为了有效地解决这个问题,这里有一些建议:
使用延迟加载:确保使用 fetch = FetchType.LAZY 设置 @ManyToMany 关系。这样,只有在显式访问时才会加载关联数据。例如:
java Копировать код
@ManyToMany(fetch = FetchType.LAZY)private Set<ArticoloPolicySconto> articoloPolicySconti;
这降低了应用程序启动期间获取不必要数据的风险。
使用 JPQL/Criteria API 进行自定义查询:您可以创建自定义存储库方法来仅获取与登录用户相关的数据,而不是依赖自动加载关系。例如:
@Query("SELECT aps FROM ArticoloPolicySconto aps JOIN aps.users u WHERE u.id = :userId")List<ArticoloPolicySconto> findPolicyByUserId(@Param("userId") Long userId);
这种方法可以最大限度地减少随时获取和处理的数据。
批处理或分页:如果获取数据仍然会因大小而导致性能问题,请考虑在查询中使用批处理或分页来获取较小的数据块:
PageRequest pageRequest = PageRequest.of(0, 100); // Example for pagination
List<ArticoloPolicySconto> policies = repository.findPolicyByUserId(userId, pageRequest);
PostgreSQL 中的索引:确保您的数据库表在查询中使用的字段上有适当的索引(例如 id_user、id_articolo、politica_sconto_id)。这将显着提高查询性能。
此外,如果您需要定制帮助来优化您的系统,Elogic Commerce恰好专注于电子商务解决方案,包括优化像您这样的复杂系统中的数据库关系和性能。如果您想考虑合作,请随时联系我们 - 我们过去曾帮助公司解决类似的挑战)
最好的。