Оптимизация работы с БД

This commit is contained in:
sshkurov
2022-02-05 04:03:41 +03:00
parent d255584555
commit 70449e435a
6 changed files with 34 additions and 24 deletions

View File

@@ -37,6 +37,7 @@ dependencies {
implementation group: 'org.bouncycastle', name: 'bcprov-jdk15on', version: '1.69'
implementation group: 'org.bouncycastle', name: 'bctls-jdk15on', version: '1.70'
implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.5'
compileOnly 'org.jetbrains:annotations:22.0.0'
compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'

View File

@@ -24,6 +24,7 @@ import java.util.Objects;
@Builder
@Getter
@ToString
@Table(indexes = { @Index(name = "found_pattern_packet_id_index", columnList = "packet_id DESC") })
public class FoundPattern {
@Id

View File

@@ -1,13 +1,19 @@
package ru.serega6531.packmate.model;
import lombok.*;
import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.Hibernate;
import org.hibernate.annotations.GenericGenerator;
import org.hibernate.annotations.Parameter;
import ru.serega6531.packmate.model.enums.Protocol;
import javax.persistence.*;
import java.util.*;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
@Getter
@Setter
@@ -24,6 +30,7 @@ import java.util.*;
@Parameter(name = "optimizer", value = "hilo")
}
)
@Table(indexes = {@Index(name = "stream_id_desc_index", columnList = "id DESC")})
public class Stream {
@Id

View File

@@ -1,6 +1,7 @@
package ru.serega6531.packmate.model.pojo;
import lombok.Data;
import org.jetbrains.annotations.Nullable;
import org.springframework.data.domain.Sort;
import ru.serega6531.packmate.model.Pattern;
@@ -9,12 +10,14 @@ public class Pagination {
private Sort.Direction direction;
private long startingFrom;
@Nullable
private Long startingFrom;
private int pageSize;
private boolean favorites; // только для стримов, определяет, искать только избранные стримы или все
@Nullable
private Pattern pattern; // только для стримов, если не null, ищем стримы с этим паттерном
}

View File

@@ -1,12 +1,11 @@
package ru.serega6531.packmate.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.jpa.repository.*;
import ru.serega6531.packmate.model.Packet;
import ru.serega6531.packmate.model.Stream;
import java.util.Optional;
import javax.persistence.QueryHint;
import java.util.List;
public interface StreamRepository extends JpaRepository<Stream, Long>, JpaSpecificationExecutor<Stream> {
@@ -16,11 +15,12 @@ public interface StreamRepository extends JpaRepository<Stream, Long>, JpaSpecif
long deleteByEndTimestampBeforeAndFavoriteIsFalse(long threshold);
@Query("SELECT s FROM Stream s " +
"JOIN FETCH s.packets AS packets " +
"LEFT JOIN FETCH packets.matches " +
"WHERE s.id = :id"
@Query("SELECT DISTINCT p FROM Packet p " +
"LEFT JOIN FETCH p.matches " +
"WHERE p.stream.id = :streamId " +
"ORDER BY p.id"
)
Optional<Stream> getStreamWithPackets(long id);
@QueryHints(@QueryHint(name = org.hibernate.jpa.QueryHints.HINT_PASS_DISTINCT_THROUGH, value = "false"))
List<Packet> getPackets(long streamId);
}

View File

@@ -7,12 +7,10 @@ import org.springframework.beans.factory.annotation.Value;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.http.HttpStatus;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.server.ResponseStatusException;
import ru.serega6531.packmate.model.*;
import ru.serega6531.packmate.model.enums.PatternActionType;
import ru.serega6531.packmate.model.enums.PatternDirectionType;
@@ -245,10 +243,7 @@ public class StreamService {
}
public List<Packet> getPackets(long streamId) {
return repository.getStreamWithPackets(streamId)
.map(Stream::getPackets)
.map(packets -> packets.stream().distinct().collect(Collectors.toList()))
.orElseThrow(() -> new ResponseStatusException(HttpStatus.NOT_FOUND));
return repository.getPackets(streamId);
}
/**
@@ -267,11 +262,14 @@ public class StreamService {
public List<Stream> findAll(Pagination pagination, Optional<Integer> service, boolean onlyFavorites) {
PageRequest page = PageRequest.of(0, pagination.getPageSize(), pagination.getDirection(), "id");
Specification<Stream> spec;
if (pagination.getDirection() == Sort.Direction.ASC) {
spec = streamIdGreaterThan(pagination.getStartingFrom());
} else {
spec = streamIdLessThan(pagination.getStartingFrom());
Specification<Stream> spec = Specification.where(null);
if (pagination.getStartingFrom() != null) {
if (pagination.getDirection() == Sort.Direction.ASC) {
spec = spec.and(streamIdGreaterThan(pagination.getStartingFrom()));
} else {
spec = spec.and(streamIdLessThan(pagination.getStartingFrom()));
}
}
if (service.isPresent()) {