当前位置: 首页 > 知识库问答 >
问题:

JPA spring启动-当数据库很大时(20M行表),findBy速度非常慢

谭新知
2023-03-14

我需要你们关于JPA spring数据的联系。我的数据库使用MySQL,数据容量为20GB(20m行)。当我执行findByID(字符串id)-(不是唯一标识符)时。这需要10多分钟。。。

性能问题可能是什么??

我的对象实体:

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long rootId;

private String address;


private String check_in_time;

private String check_out_time;

@OneToMany(mappedBy = "data" , fetch = FetchType.LAZY)
private Set<DescriptionStruct> description_struct;

private String id;

@ElementCollection(fetch = FetchType.LAZY)
private Set<String> images;

private String kind;

private double latitude;

private double longitude;

private String name;

private String phone;

@Embedded
private Star_certificate star_certificate;

private String postal_code;


@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "R_ID")),
        @AttributeOverride(name = "name", column = @Column(name = "R_NAME")) })
@Embedded
private Region region;

private int star_rating;

private String email;

private int semantic_version;

@ElementCollection(fetch = FetchType.LAZY)
private Set<String> serp_filters;

private boolean is_closed;

@Embedded
private MetapolicyStruct metapolicy_struct;

private String metapolicy_extra_info;

@Embedded
private Facts facts;

@ElementCollection(fetch = FetchType.LAZY)
private Set<String> payment_methods;

private String hotel_chain;

@OneToMany(mappedBy = "data", fetch = FetchType.LAZY)
private Set<AmenityGroup> amenity_groups;

@OneToMany(mappedBy = "data", fetch = FetchType.LAZY)
private Set<RoomGroup> room_groups;

@OneToMany(mappedBy = "data", fetch = FetchType.LAZY)
private Set<PolicyStruct> policy_struct;

我的职能:

@自动连线专用数据存储库数据存储库;

public regionSearchData returnFullData(regionSearchResponseRH response) {
    
    regionSearchData data = new regionSearchData();

    
    response.getData().getHotels().forEach(H -> {

        Data hotelD = dataRepository.findById(H.getId());
        if (hotelD != null) {
            RatesSearch R = H.getRates().get(0);
            R.setAddress(hotelD.getAddress());
            R.setImages(hotelD.getImages());
            R.setStar_certificate(hotelD.getStar_certificate());
            R.setStar_rating(hotelD.getStar_rating());
            R.setName(hotelD.getName());
                
        }
        
        });
    
    data.setTotal_hotels(response.getData().getTotal_hotels());
    data.setHotels(response.getData().getHotels()); 

    return data;
    
    
    
}

Hibernate统计:

16893585 nanoseconds spent preparing 42 JDBC statements;
347535215661 nanoseconds spent executing 42 JDBC statements;
656641754926 nanoseconds spent executing 82 JDBC statements;

如果我移除findBy需要10秒。。。

谢谢,伊丹

共有1个答案

戚奇略
2023-03-14

绝对有不止一件事你可以尝试。您的代码需要超过十分钟,这可能是因为它通过网络对数据库进行了多次往返。请记住,不仅数据库搜索需要更多时间,而且从应用程序到数据库的网络往返也需要更多时间,我怀疑这里就是这种情况。

根据您的用例,您可以做的第一件事是最小化到DB的往返,在for循环中调用findById()是最糟糕的事情。以下是我的建议

  1. 向要搜索的字段添加索引
  2. 避免在for循环中调用findById(),您可以使用其他存储库方法,也可以编写findByIdsIn(ID列表),具体取决于for循环的大小-您可以一次传递所有ID,或者使用批处理方法,例如一次获取20-30个实体并执行业务逻辑。
  3. 您有许多表使用@oneToMany或@ElementCollection连接到您的实体,您需要检查hibernate是否正在为此执行N 1查询,如果是,请首先解决该问题
 类似资料:
  • 我使用的是Guidewire开发工作室(基于IntelliJ的IDE),在处理大文本文件(~1500行及以上)时速度非常慢。我也尝试了一个开箱即用的社区IntelliJ,但遇到了同样的问题。 当我打开这些文件时,键入一个字符需要 1 秒,即使我清楚地看到使用的内存仍然足够 (1441 MB/3959 MB)。此外,如果我打开多个文件,它会迅速吸收所有内存(我只为 IntelliJ 分配 4GB)。

  • 问题内容: 我已经开发了一个用户批量上传模块。有两种情况,当数据库有零条记录时,我批量上传了20000条记录。大约需要5个小时。但是,当数据库已经有大约30 000条记录时,上传速度将非常缓慢。上载2万条记录大约需要11个小时。我只是通过fgetcsv方法读取CSV文件。 下面是运行的查询。(我正在使用Yii框架) 如果存在,请更新用户: 如果用户不存在,请插入新记录。 表引擎类型为MYISAM。

  • 我有26个CSV文件,我想每晚从互联网上抓取并上传到Postgresql表中。我使用Java、PreparedStatement和Batch实现了这一点。尽管如此,性能仍然非常缓慢。要获取大约6000个条目并将其放入Postgresql,需要30分钟。这是我第一次做这样的事情,所以我不知道这是快还是慢。 为了获取文件,我使用了以下代码。 然后,我使用PreparedStatement从输入流中提取

  • 我有Spring启动应用程序与三个弹性搜索群集(ES v6.4.2)配置。application.properties文件如下(我为每个集群配置了三个主节点,但为了简单起见,这里显示了一个): 对于每个集群,我都有一个单独的配置类,在其中设置TransportClient和ElasticsearchTemplate。 现在,当我在本地计算机上运行所有三个集群的情况下本地启动应用程序时,应用程序会正

  • 我想知道如何使用 Spark SQL 来处理存储在关系数据库中的结构化大数据?我的表格包含超过 40 亿条线(GPS 坐标)。在使用合并操作时,Spark尝试处理内存中的整个表,这是不可能的。我知道 Spark 是“内存中”处理,但就我而言,内存无法容纳整个表。那么,当表很大时,是否可以在关系数据库中使用 spark?

  • 问题内容: 由于某种原因,我的hibernate应用程序的启动非常缓慢。(最多2分钟)我一直在思考c3p0配置是完全错误,但是研究日志显示,在建立与服务器的连接之后,没有任何活动。同样,使用Hibernate的内置轮询功能可以显示相同的结果。 这是日志的摘录: (请注意#comment#。) 我也尝试了较旧的Postgres JDBC驱动程序,但没有任何运气。 连接到本地数据库就可以了。立即建立连