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

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: 'bcprov-jdk15on', version: '1.69'
implementation group: 'org.bouncycastle', name: 'bctls-jdk15on', version: '1.70' implementation group: 'org.bouncycastle', name: 'bctls-jdk15on', version: '1.70'
implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.5' implementation group: 'org.modelmapper', name: 'modelmapper', version: '2.4.5'
compileOnly 'org.jetbrains:annotations:22.0.0'
compileOnly 'org.projectlombok:lombok' compileOnly 'org.projectlombok:lombok'
runtimeOnly 'org.springframework.boot:spring-boot-devtools' runtimeOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql' runtimeOnly 'org.postgresql:postgresql'

View File

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

View File

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

View File

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

View File

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