gpt4 book ai didi

hibernate 性能问题

转载 作者:行者123 更新时间:2023-12-02 23:01:01 25 4
gpt4 key购买 nike

我对 Hibernate 非常陌生。在这里我想比较两个选项。

第一个选项

我的 hibernate pojo 类如下。

Stock {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "stock_id")
private Long stockId;

@Column(name = "stock_name")
private String stockName;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "stock_characteristics", joinColumns = {@JoinColumn(name = "stock_id")}, inverseJoinColumns = {@JoinColumn(name = "ct_id")})
private List<Characteristic> characteristics = new ArrayList<>();

//constructor, getters and setters

}

Characteristics {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "ct_id", nullable = false)
private Long id;

@Column(name = "name", nullable = false, length = 32)
private String name;

//constructor, getters and setters
}

每只股票都包含一系列特征。每当我获取股票时,特征条目列表都会关联起来并得到结果。

我的股票表包含超过 100 万条记录,每只股票与 10 个特征相关联(因此 stock_characteristics 包含超过 1000 万行)。当我们获取整个结果时,stock 和 Characteristic 之间的关联可能会变慢。

第二个选项。

我重写了我的 pojo 类,如下所示。

Stock {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "stock_id")
private Long stockId;

@Column(name = "stock_name")
private String stockName;

//constructor, getters and setters

}

特征 - 同上

StockCharacteristics {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id")
private Long id;
@Column(name = "stock_id", nullable = false)
private Long stockId;
@Column(name = "ct_id", nullable = false)
private Long ctId;
}

为了获取结果集,我仅传递特征集。例如,如果将特征传递为2,那么首先我找到具有这两个特征的股票ID。然后我将从 Stock 类中投影股票详细信息。这是我的第一个选项的示例代码。

    criteria.createAlias("stock.characteristics", "stockCharacteristics",       CriteriaSpecification.INNER_JOIN).add(Restrictions.in("stockCharacteristics.id", listOfSelectedCharacteristics));
List<Object[]> projectedList = criteria.setProjection(Projections.projectionList().add(Projections.count("id")).add(Projections.groupProperty("id"))).list();
List<Long> stockIdList = new ArrayList<>();
for(Object[] entry: projectedList){
if(((Long) entry[0]).intValue() == listOfSelectedCharacteristics.size()){
stockIdList.add((Long)entry[1]);
}
}

if(!stockIdList.isEmpty()){
Criteria criteriaWithCharacteristics = getDb(true).createCriteria(Stock.class, "stock").add(Restrictions.in("id", stockIdList));
selectedStocks = criteriaWithCharacteristics.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

在这里您可以看到 Stock 和 Characteristic 之间执行了联接查询,这可能会减慢速度

这是我的第二个选项的示例代码

List<Object[]> stockIdList = //gets the stock id list from StockCharacteristics
if(!stockIdList.isEmpty()){
Criteria criteriaWithCharacteristics = getDb(true).createCriteria(Stock.class, "stock").add(Restrictions.in("id", stockIdList));
selectedStocks = criteriaWithCharacteristics.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY).list();
}

从程序的角度来看,哪个是最佳选择?或者我应该使用哪一个以获得更好的性能?

最佳答案

我认为你应该在 hibernate 中映射实体之间的所有关系。如果您想使用 hql 和条件,它将有所帮助,否则您将无法在实体之间进行联接。

为了提高性能,请将所有映射标记为 LAZY 并阅读以下内容:

https://zeroturnaround.com/rebellabs/how-to-use-jpa-correctly-to-avoid-complaints-of-a-slow-application/

我经常使用 MS SQL Server 并检查慢速查询的执行计划,以确保我的查询有良好的索引。对于 mysql,您可以使用“显示索引”

关于 hibernate 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38691373/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com